Going from memory when I debugged earlier this morning : I definitely saw and traced the objects marked w/ ForComponents going into the store. However, when I was rendering the page, I don't think there were any calls to get them out and inject them into the component. I definitely saw the code inspecting the test class for @Inject annotations to inject services into the test case.
I'll do another debug run again tonight. The test case that I have is pretty straightforward, so I should be able to zip up an example. Regards, Alex K On Fri, Jan 29, 2010 at 1:48 PM, Paul Field <paul.fi...@db.com> wrote: > Odd - it looks like the @ForComponents objects should be created and > collected (because setup/doSetUp are called); it looks like the > setup/teardown methods are called in the right way (from the call trace in > your other email). I'm having trouble seeing what's wrong. > > At this point I would probably reach for a debugger... If you can simplify > the project to something you wouldn't mind zipping up and sending to me > I'll be happy to take a look. > > > If you want to have a go yourself, then put breakpoints on the methods of > SimpleObjectsForComponentStore - which is the service that stores the > objects that you specify with @ForComponents so you can see objects being > stored and requested. Also put a breakpoint in ThreadLocalPerTestDataStore > #cleanup() so you can see when the test ends and the data is dropped from > the SimpleObjectsForComponentsStore. > > The sequence should be: > Data collected from @ForComponents - calls to > SimpleObjectsForComponentStore#put() > Page rendering, @Inject fields accessed - calls to > SimpleObjectsForComponentStore#get() > Test complete, tearDown() called - call to ThreadLocalPerTestDataStore > #cleanup() > > As well as checking the sequence is correct, you can see what is in the > store when get is being called (and what is being requested). > > - Paul > > > akochnev <akoch...@gmail.com> wrote on 29/01/2010 13:33:00: > > > > > Paul, > > thanks for the quick response. Now, down the checklist : > > > > 1. I am extending from the testng version of the class: > > package com.troymaxventures.zadachite.pagetestsupport; > > > > > > > > import com.formos.tapestry.testify.core.TapestryTester; > > import com.formos.tapestry.testify.testng.TapestryTest; > > > > public abstract class AbstractZdTapTest extends TapestryTest { > > private static final TapestryTester SHARED_TESTER = new > > TapestryTester("foo", ZdTestAppModule.class); > > > > public AbstractZdTapTest() { > > super(SHARED_TESTER); > > } > > } > > > > 2. doSetUp() is indeed being called, I added a breakpoint and a println > : > > > > @Override > > protected void doSetUp() { > > userRepo = EasyMock.createMock(UserRepository.class); > > System.out.println("The doSetUp() is called by TestNG"); > > } > > > > The doSetUp() is called by TestNG > > Tests run: 2, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 5.051 > sec > > <<< FAILURE! > > > > 3. The testng config file : > > I run the test from Maven, this is the suite file that gets generated : > > <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> > > <suite thread-count="5" skipfailedinvocationCounts="false" verbose="0" > > name="Failed suite [Command line suite]" junit="false" > annotations="JDK"> > > <test name="Command line test(failed)" junit="false" > annotations="JDK"> > > <classes> > > <class > name="com.troymaxventures.zadachite.pagetests.StupidPageTest"> > > <methods> > > <include name="processInjectAnnotation"/> > > <include name="testElementIsOnPage"/> > > <include name="tearDown"/> > > <include name="testStupidPageUnitTest"/> > > <include name="setUp"/> > > </methods> > > </class> > > </classes> > > </test> > > </suite> > > > > 4. I added an extra test where I explicitly use the pageTester to try to > > inject the dependencies into my page. When I specify a totally bogus > package > > name ( so that Testify doesn't pick up the AppModule from my app), the > test > > fails w/ an error that it can't find my page (understandable, as I had > the > > bogus package name, so it can't find the page) when I render the page > using > > the tester; however, when I try to inject the dependencies directly into > the > > object instance, it fails that there is no instance of UserRepository . > When > > I include the full package name (so that testify picks up the > AppModule), > > the injectInto populates the service from the AppModule and not with the > > implementation that I provide in the test. When I use the > > tester.renderPage("stupid") and debug the page, I see nulls set on all > the > > services (e.g. in my example, userRepo is null), and I also see non-null > > values in some mangled names in the class (e.g. something like > > _$nonTestUserRepo) > > > > > > > > ------------------------------------------------------------------------------- > > Test set: TestSuite > > > > ------------------------------------------------------------------------------- > > Tests run: 2, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 5.052 > sec > > <<< FAILURE! > > > testElementIsOnPage(com.troymaxventures.zadachite.pagetests.StupidPageTest) > > > Time elapsed: 0.966 sec <<< FAILURE! > > java.lang.RuntimeException: Request was not handled: 'stupid' may not be > a > > valid page name. > > at > > org.apache.tapestry5.test.PageTester.renderPage(PageTester.java:177) > > at > > com.troymaxventures.zadachite.pagetests.StupidPageTest. > > testElementIsOnPage(StupidPageTest.java:40) > > > > testStupidPageUnitTest(com.troymaxventures.zadachite.pagetests. > > StupidPageTest) > > Time elapsed: 0.01 sec <<< FAILURE! > > java.lang.RuntimeException: No service implements the interface > > com.troymaxventures.zadachite.services.UserRepository. > > at > > org.apache.tapestry5.ioc.internal.RegistryImpl. > > getService(RegistryImpl.java:575) > > at > > org.apache.tapestry5.ioc.internal.RegistryWrapper. > > getService(RegistryWrapper.java:58) > > at > > org.apache.tapestry5.test.PageTester.getService(PageTester.java:154) > > at > > com.formos.tapestry.testify.core.TapestryTester$FieldInjector. > > process(TapestryTester.java:125) > > at > > com.formos.tapestry.testify.core.TapestryTester. > > processField(TapestryTester.java:106) > > at > > com.formos.tapestry.testify.core.TapestryTester. > > processFieldsAnnotatedWith(TapestryTester.java:96) > > at > > com.formos.tapestry.testify.core.TapestryTester. > > injectInto(TapestryTester.java:74) > > at > > com.troymaxventures.zadachite.pagetests.StupidPageTest. > > testStupidPageUnitTest(StupidPageTest.java:53) > > > > The superclass w/ a bogus package name: > > import com.formos.tapestry.testify.core.TapestryTester; > > import com.formos.tapestry.testify.testng.TapestryTest; > > > > public abstract class AbstractZdTapTest extends TapestryTest { > > private static final TapestryTester SHARED_TESTER = new > > TapestryTester("foo", ZdTestAppModule.class); > > > > public AbstractZdTapTest() { > > super(SHARED_TESTER); > > } > > } > > > > import com.formos.tapestry.testify.core.ForComponents; > > import com.troymaxventures.zadachite.model.EmailAddress; > > import com.troymaxventures.zadachite.model.UserRegistration; > > import com.troymaxventures.zadachite.model.ZdUser; > > import com.troymaxventures.zadachite.pages.Stupid; > > import com.troymaxventures.zadachite.pagetestsupport.AbstractZdTapTest; > > import com.troymaxventures.zadachite.services.UserRepository; > > import org.apache.tapestry5.dom.Document; > > import org.easymock.EasyMock; > > import org.testng.Assert; > > import org.testng.annotations.Test; > > import static org.easymock.EasyMock.*; > > > > /** > > * > > * @author polrtex > > */ > > public class StupidPageTest extends AbstractZdTapTest { > > @ForComponents > > UserRepository userRepo; > > > > > > @Override > > protected void doSetUp() { > > userRepo = EasyMock.createMock(UserRepository.class); > > System.out.println("The doSetUp() is called by TestNG"); > > } > > > > > > @Test > > public void testElementIsOnPage() throws Exception { > > > > expect(userRepo.userRegistered((EmailAddress)anyObject())). > > andStubReturn(Boolean.FALSE); > > ZdUser testUser = new ZdUser(new EmailAddress("f...@bar.com")); > > > > expect(userRepo.registerUser(isA(UserRegistration.class))). > > andStubReturn(testUser); > > > > replay(userRepo); > > > > Document page = tester.renderPage("stupid"); > > Assert.assertTrue(page.toString().contains("I should be empty")); > > } > > > > @Test > > public void testStupidPageUnitTest() throws Exception { > > > > expect(userRepo.userRegistered((EmailAddress)anyObject())). > > andStubReturn(Boolean.FALSE); > > ZdUser testUser = new ZdUser(new EmailAddress("f...@bar.com")); > > > > expect(userRepo.registerUser(isA(UserRegistration.class))). > > andStubReturn(testUser); > > > > replay(userRepo); > > > > Stupid s = new Stupid(); > > // when I have a bogus package name, this fails w/ a message > that > > there are no UserRepository-ies to inject > > tester.injectInto(s); > > s.setupRender(); > > > > } > > } > > > > > > > > > > Paul Field-4 wrote: > > > > > > > > > The next thing is probably to check that the various setup methods are > > > > being called. Can you put a print statement into doSetUp() and check > it's > > > actually being called? This will let us see whether the setup isn't > being > > > called, or the @ForComponents processing isn't working properly. I > suspect > > > the doSetUp()isn't being called and that's going to be a TestNG thing: > it > > > should be calling TapestryTest#setUp() method... Can you check the > TestNG > > > output reports - I seem to remember that one of them outputs the > sequence > > > of setup methods and tests? If you're still stuck can you also send > the > > > testng configuration (xml) file? > > > > > > Let me know what you find. > > > > > > - Paul > > > > > > > > > > > > > > > akochnev <akoch...@gmail.com> wrote on 29/01/2010 11:24:01: > > > > > >> > > >> I'm running into trouble with using services declared inside of a > > > Testify > > >> TestNG test case with @ForComponents into my pages - when I ask the > > > tester > > >> to render a page, the services that were supposed to be injected, are > > > > null. > > >> Any tips on what I'm doing wrong ? > > >> > > >> > > >> Here is the sample code: > > >> > > >> public class StupidPageTest extends AbstractZdTapTest { > > >> @ForComponents > > >> private UserRepository userRepo; > > >> > > >> > > >> @Override > > >> protected void doSetUp() { > > >> userRepo = EasyMock.createMock(UserRepository.class); > > >> } > > >> > > >> > > >> @Test > > >> public void testElementIsOnPage() throws Exception { > > >> > > >> expect(userRepo.userRegistered((EmailAddress)anyObject())). > > >> andStubReturn(Boolean.FALSE); > > >> ZdUser testUser = new ZdUser(new > EmailAddress("f...@bar.com"));; > > >> > > >> expect(userRepo.registerUser(isA(UserRegistration.class))). > > >> andStubReturn(testUser); > > >> replay(userRepo); > > >> Document page = tester.renderPage("stupid"); > > >> System.out.println("Rendered page: " + page.toString()); > > >> > > >> } > > >> } > > >> > > >> public abstract class AbstractZdTapTest extends TapestryTest { > > >> private static final TapestryTester SHARED_TESTER = new > > >> TapestryTester("com.troymaxventures.zadachite", > > >> ZdTestAppModule.class,AppModule.class); > > >> > > >> public AbstractZdTapTest() { > > >> super(SHARED_TESTER); > > >> } > > >> } > > >> > > >> public abstract class AbstractZdTapTest extends TapestryTest { > > >> private static final TapestryTester SHARED_TESTER = new > > >> TapestryTester("com.troymaxventures.zadachite", > ZdTestAppModule.class); > > >> > > >> public AbstractZdTapTest() { > > >> super(SHARED_TESTER); > > >> } > > >> } > > >> > > >> public class ZdTestAppModule { > > >> > > >> /** > > >> * Ensure that there are valid HTTP request/response objects in > the > > >> test, otherwise the ACEGI integration tends to blow up. > > >> */ > > >> public static void > > >> contributeRequestHandler(OrderedConfiguration<RequestFilter> config, > > > final > > >> RequestGlobals requestGlobals) { > > >> RequestFilter filter = new RequestFilter() { > > >> > > >> @Override > > >> public boolean service(Request request, Response > response, > > >> RequestHandler handler) throws IOException { > > >> > > >> requestGlobals.storeServletRequestResponse(EasyMock. > > >> createMock(HttpServletRequest.class), > > >> EasyMock.createMock(HttpServletResponse.class)); > > >> return handler.service(request, response); > > >> } > > >> }; > > >> config.add("EnsureNonNullHttpRequestAndResponse", filter, > > >> "before:*"); > > >> } > > >> } > > >> > > >> public class Stupid { > > >> @Inject > > >> private UserRepository userRepo; > > >> void setupRender() throws StorageException { > > >> // the userRepo is null here during the test > > >> userRepo.getUser(new EmailAddress("f...@bar.com")); > > >> } > > >> } > > >> > > >> > > >> -- > > >> View this message in context: http://old.nabble.com/TestNG--- > > >> Injecting-Testify-services-into-pages-tp27370621p27370621.html > > >> Sent from the Tapestry - User mailing list archive at Nabble.com. > > >> > > >> > > >> --------------------------------------------------------------------- > > >> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > > >> For additional commands, e-mail: users-h...@tapestry.apache.org > > >> > > > > > > > > > > > > --- > > > > > > This e-mail may contain confidential and/or privileged information. If > you > > > are not the intended recipient (or have received this e-mail in error) > > > please notify the sender immediately and delete this e-mail. Any > > > unauthorized copying, disclosure or distribution of the material in > this > > > e-mail is strictly forbidden. > > > > > > Please refer to http://www.db.com/en/content/eu_disclosures.htm for > > > additional EU corporate and regulatory disclosures. > > > > > > > -- > > View this message in context: http://old.nabble.com/TestNG--- > > Injecting-Testify-services-into-pages-tp27370621p27371994.html > > Sent from the Tapestry - User mailing list archive at Nabble.com. > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > > For additional commands, e-mail: users-h...@tapestry.apache.org > > > > > > --- > > This e-mail may contain confidential and/or privileged information. If you > are not the intended recipient (or have received this e-mail in error) > please notify the sender immediately and delete this e-mail. Any > unauthorized copying, disclosure or distribution of the material in this > e-mail is strictly forbidden. > > Please refer to http://www.db.com/en/content/eu_disclosures.htm for > additional EU corporate and regulatory disclosures. >