incubator-cloudstack-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Frank Zhang <Frank.Zh...@citrix.com>
Subject RE: Writing unit tests after javelin is merged in.
Date Sat, 26 Jan 2013 01:54:21 GMT
> Frank,
> 
> Great!   Two questions.
> 
> - How does it work when the unit test itself needs a component injected?
> Setup() is only called before the test but not before the unit test is initialized.

The components in unit case should be gotten by ComponentContext.getComponent() call, not
by Spring injection.
That means the unit test case itself is not Spring aware of.  

For example, to get UserVmDao  the code then would look like:

Public class MyTestCase() {
	private UserVmDao vmDao;

	@Before
	Public void setup() throws Exception {
		ComponentContext.setComponentsToLoad(Class<?>[] { SecurityGroupRulesDaoImpl.class,
        			UserVmDaoImpl.class,
        			AccountDaoImpl.class,});

		ComponentContext. initComponentsLifeCycle();
              
		vmDao = ComponentContext.getComponent(UserVmDaoImpl.class)             
 
	}
}

> - What about the aop extras that Kelven has added in the xml file?  I don't
> see them specified in the setup() method.  How does that get loaded?
> 

Configuration.xml you post is as a template, so it would contains all necessary beans including
extra stuff like AOP.
When creating new spring xml file, ComponentContext copies the Configuration.xml and inject
new beans declarations into it.
Then the final xml file will contains all components needed


> Thanks.
> 
> --Alex
> 
> > -----Original Message-----
> > From: Frank Zhang [mailto:Frank.Zhang@citrix.com]
> > Sent: Friday, January 25, 2013 5:06 PM
> > To: cloudstack-dev@incubator.apache.org
> > Subject: RE: Writing unit tests after javelin is merged in.
> >
> > I think the former mail is too verbose. Let me summarize:
> >
> > For a unit test case, all necessary to do is:
> >
> > @Before
> > public void setup() throws Exception {
> > 	ComponentContext.setComponentsToLoad(Class<?>[]
> > { SecurityGroupRulesDaoImpl.class,
> >         		UserVmDaoImpl.class,
> >         		AccountDaoImpl.class,});
> >
> > 	ComponentContext. initComponentsLifeCycle(); }
> >
> > To achieve this. Dynamically generate spring xml configure file
> > including beans specified in setComponentsToLoad(), use the generated
> > file to create Spring ApplicationContext.
> >
> >
> >
> > > -----Original Message-----
> > > From: Frank Zhang [mailto:Frank.Zhang@citrix.com]
> > > Sent: Friday, January 25, 2013 4:59 PM
> > > To: cloudstack-dev@incubator.apache.org
> > > Subject: RE: Writing unit tests after javelin is merged in.
> > >
> > > Alex, I feel the wiki you post is too complex to write a unit case.
> > > If I understand correctly, the whole purpose about configuration.xml
> > > and "test configuration" class is to load components needed by unit test
> case.
> > > From a programmer's perspective, all things I think are necessary to
> > > do is
> > like
> > > below:
> > >
> > > @Before
> > > public void setup() throws Exception {
> > > 	ComponentContext.setComponentsToLoad(Class<?>[]
> > > { SecurityGroupRulesDaoImpl.class,
> > >         		UserVmDaoImpl.class,
> > >         		AccountDaoImpl.class,});
> > > 	ComponentContext. initComponentsLifeCycle(); }
> > >
> > > For these mock component, test case itself should know where to get
> > > it,
> > for
> > > example, by calling Mockito.mock().
> > >
> > > To achieve this, ComponentContext needs below enhancements:
> > > 1. add method setComponentsToLoad() that receives a list of Class<?>
> > > of components 2. save configuration.xml to a well-know place in
> classpath.
> > The
> > > content of configuration.xml is 99% the same as you post, except
> removing:
> > >
> > >   <bean id="TestConfiguration"
> > >     class="[Test Configuration]" />
> > >
> > > then the file works as a template for Spring beans.
> > >
> > > 3.  ComponentContext  generates a new xml file from
> > > configuration.xml template when initComponentsLifeCycle() gets
> > > called,  the new xml file would contain  all bean declarations for
> > > classes specified in setComponentsToLoad(). as aforementioned
> > > example, the new generated xml will contain extra 3 items like
> > >
> > > <bean name="SecurityGroupRulesDaoImpl" class="full_class_name_of_
> > > SecurityGroupRulesDaoImpl" /> <bean name=" UserVmDaoImpl "
> > > class="full_class_name_of_UserVmDaoImpl" /> <bean name="
> > > AccountDaoImpl " class="full_class_name_of_AccountDaoImpl " />
> > >
> > > 4. save the new xml file generated in step 3 to root class path of
> > > unit test case with a new name. For standard maven it is
> > > test/target/test-classes/,
> > but
> > > I didn't see this hierarchy in our code base, let's assume the path
> > > is test/classes/. So the new xml file would be saved as:
> > >
> > > test/classes/spring_configuration_for_test_case_xxx.xml
> > >
> > > 5. create Spring ApplicationContext using the new generated
> > > configuration file in initComponentsLifeCycle().
> > >
> > > 6. don't use @ContextConfiguration(locations =
> > > "classpath:/[configuration.xml]") as we use dynamic Spring
> > > configuration
> > >
> > >
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: Alex Huang [mailto:Alex.Huang@citrix.com]
> > > > Sent: Friday, January 25, 2013 10:25 AM
> > > > To: cloudstack-dev@incubator.apache.org
> > > > Subject: RE: Writing unit tests after javelin is merged in.
> > > >
> > > > Hi Howie,
> > > >
> > > > Thanks for the offer to help.  I believe we finally converted all
> > > > tests yesterday but turns out the tests are not running  because
> > > > they've been disabled on master branch due to no db access on the
> > > > build
> > > machines.
> > > >
> > > > The code is on javelin on asf.  You're welcome to peruse and make
> > > > any suggestions about how we're using spring in the unit tests.
> > > > Would love to find a way to stop creating 3 different files for every
unit
> test.
> > > >
> > > > Thanks again.
> > > >
> > > > --Alex
> > > >
> > > > > -----Original Message-----
> > > > > From: Howie Yu [mailto:howie_yu@trend.com.tw]
> > > > > Sent: Thursday, January 24, 2013 5:28 PM
> > > > > To: cloudstack-dev@incubator.apache.org
> > > > > Subject: Re: Writing unit tests after javelin is merged in.
> > > > >
> > > > > Hi Alex
> > > > >
> > > > > I would like to help~
> > > > >
> > > > > But which repository should I use? Form github's javelin or asf's
> javelin ?
> > > > >
> > > > >
> > > > > On 13/1/25 上午8:17, "Alex Huang" <Alex.Huang@citrix.com>
wrote:
> > > > >
> > > > > >I wrote up a page on how to write unit tests after the Spring
> > > > > >injection framework is in.  Please see here.
> > > > > >
> > > > > >https://cwiki.apache.org/confluence/display/CLOUDSTACK/Unit+Te
> s
> > > > > >ti
> > n
> > > g
> > > > +
> > > > > with+J
> > > > > >Unit+and+Spring
> > > > > >
> > > > > >We also need help in javelin to finish converting the unit
> > > > > >tests over to this format.  If you can help, let me know.
> > > > > >
> > > > > >Thanks.
> > > > > >
> > > > > >--Alex
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > > <table class="TM_EMAIL_NOTICE"><tr><td><pre>
> > > > > TREND MICRO EMAIL NOTICE
> > > > > The information contained in this email and any attachments is
> > > > > confidential and may be subject to copyright or other
> > > > > intellectual property
> > > > protection.
> > > > > If you are not the intended recipient, you are not authorized to
> > > > > use or disclose this information, and we request that you notify
> > > > > us by reply mail or telephone and delete the original message
> > > > > from your mail
> > > > system.
> > > > > </pre></td></tr></table>

Mime
View raw message