Hi josh, thanks a lot. I follow your advice and tries to include all the module that i could think of. This is the modified initRegistry method :
private void initRegistry() { RegistryBuilder builder = new RegistryBuilder(); builder.add(TapestryModule.class); builder.add(AppModule.class); builder.add(HibernateCoreModule.class); builder.add(ChenilleKitQuartzModule.class); registry = builder.build(); registry.performRegistryStartup(); } Adding TapestryModule fix the previous error, but i think I'm missing a little something here. The ChennileKitQuartzModule throw a null pointer exception Caused by: java.lang.RuntimeException: Error invoking service contribution method net.mreunion.cinematorserver.services.AppModule.contributeSchedulerFactory(ApplicationGlobals, OrderedConfiguration): java.lang.NullPointerException at org.apache.tapestry5.ioc.internal.ContributionDefImpl.invokeMethod(ContributionDefImpl.java:139) at org.apache.tapestry5.ioc.internal.ContributionDefImpl.contribute(ContributionDefImpl.java:82) at org.apache.tapestry5.ioc.internal.RegistryImpl$9.run(RegistryImpl.java:651) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:50) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:47) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65) ... 98 more Caused by: java.lang.NullPointerException at net.mreunion.cinematorserver.services.AppModule.contributeSchedulerFactory(AppModule.java:116) That leads to the quartz contribution method in my app module public static void contributeSchedulerFactory( @InjectService("ApplicationGlobals") ApplicationGlobals applicationGlobals, OrderedConfiguration<URL> configuration) { String fileName = applicationGlobals.getServletContext().getRealPath( "/WEB-INF/classes/quartz.properties"); File file = new File(fileName); if (!file.canRead()) throw new RuntimeException(String.format("can't read file '%s'", file.toURI())); try { configuration.add("configuration", file.toURI().toURL()); } catch (MalformedURLException e) { throw new RuntimeException(e); } } public static void contributeQuartzSchedulerManager( OrderedConfiguration<JobSchedulingBundle> configuration, CrawlingJobImpl crawlingJob, JakartaCrawler crawler) { configuration.add("crawlScheduler", new CrawlSchedulerBundle(crawlingJob, crawler)); } The null pointer is in the String fileName = applicationGlobals.getServletContext().getRealPath( "/WEB-INF/classes/quartz.properties"); I guess it makes sense, since TestNG is not using Servlet Context to run the test. Is there anyway to contribute the quartz.properties that will work inside and outside of the servlet context ? Cheers, Abangkis On Wed, Jan 5, 2011 at 9:38 PM, Josh Canfield <joshcanfi...@gmail.com>wrote: > It doesn't look like you are including TapestryModule in your registry. > Since you're building the registry you're in charge kit adding all the > modules. > > Optionally you could add @SubModule(TapestryModule.class) to your AppModule > to make the dependency explicit. > On Jan 5, 2011 4:25 AM, "abangkis" <abang...@gmail.com> wrote: > > Hello, i have a tapestry app that consist of 1-2 pages, and lots of > > services. The apps is used to crawl another website. The apps uses > hibernate > > module, quartz and some other contribution. Because of the nature of my > > apps, i want to test the services class using TestNG. I've created a > simple > > test that build the tapestry registry for my services and run it. But i > > received an error that the ComponentRequestHandler doesn't exist. Here's > the > > contribution in the appmodule, test file and the stack trace. I wonder > what > > I've missed ? > > > > > > Cheers, > > Abangkis > > > > public class AppModule { > > .... > > > > public void > > > > contributeComponentRequestHandler(OrderedConfiguration<ComponentRequestFilter> > > configuration) { > > configuration.addInstance("PageProtectionFilter", > > PageProtectionFilter.class); > > } > > public void contributeRequestHandler(OrderedConfiguration<RequestFilter> > > configuration, > > PageRenderLinkSource pageRenderLinkSource) { > > final HashSet<String> ASSETS_WHITE_LIST = new > > HashSet<String>(Arrays.asList("jpg", "jpeg", "png", "gif", "js", > > "css", "ico", "html", "json")); > > configuration.add("AssetProtectionFilter", new > > AssetProtectionFilter(ASSETS_WHITE_LIST, pageRenderLinkSource), > > "before:*"); > > } > > .... > > } > > > > public class MyTest { > > private Registry registry; > > > > @Test > > public void f() { > > String pageName = "DummyPage"; > > MovieManager movieManager = registry.getService(MovieManager.class); > > String result = movieManager.getMovieTitle(pageName); > > assertEquals("Gullivers Island", result); > > } > > > > @BeforeClass > > public void beforeClass() { > > // registry = IOCUtilities.buildDefaultRegistry(); > > initRegistry(); > > } > > > > private void initRegistry() { > > RegistryBuilder builder = new RegistryBuilder(); > > builder.add(ChenilleKitQuartzModule.class); > > builder.add(AppModule.class); > > registry = builder.build(); > > registry.performRegistryStartup(); > > } > > > > @AfterClass > > public void afterClass() { > > registry.shutdown(); > > } > > > > } > > > > FAILED CONFIGURATION: @BeforeClass beforeClass > > java.lang.IllegalArgumentException: Contribution > > > > net.mreunion.cinematorserver.services.AppModule.contributeComponentRequestHandler(OrderedConfiguration) > > (at AppModule.java:145) is for service 'ComponentRequestHandler', which > does > > not exist. > > at > > > > org.apache.tapestry5.ioc.internal.RegistryImpl.validateContributeDefs(RegistryImpl.java:253) > > at > > > > org.apache.tapestry5.ioc.internal.RegistryImpl.<init>(RegistryImpl.java:229) > > at > org.apache.tapestry5.ioc.RegistryBuilder.build(RegistryBuilder.java:170) > > at > > net.mreunion.cinematorserver.TestEscapedCharacter.initRegistry(MyTest > .java:45) > > at > > net.mreunion.cinematorserver.TestEscapedCharacter.beforeClass(MyTest > .java:33) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > > at java.lang.reflect.Method.invoke(Unknown Source) > > at > > > > org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:74) > > at > org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:525) > > at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:202) > > at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:130) > > at > > > > org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:173) > > at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105) > > at org.testng.TestRunner.runWorkers(TestRunner.java:1125) > > at org.testng.TestRunner.privateRun(TestRunner.java:749) > > at org.testng.TestRunner.run(TestRunner.java:600) > > at org.testng.SuiteRunner.runTest(SuiteRunner.java:317) > > at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:312) > > at org.testng.SuiteRunner.privateRun(SuiteRunner.java:274) > > at org.testng.SuiteRunner.run(SuiteRunner.java:223) > > at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) > > at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) > > at org.testng.TestNG.runSuitesSequentially(TestNG.java:995) > > at org.testng.TestNG.runSuitesLocally(TestNG.java:920) > > at org.testng.TestNG.run(TestNG.java:856) > > at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:110) > > at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:205) > > at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:174) > > > > > > -- > > http://www.mreunion-labs.net/ > > twitter : @mreunionlabs > > blog : mreunion.wordpress.com > > Follow our android survey at : > > http://www.mreunion-labs.net/downloads:dlapk/MySurvey.apk > -- http://www.mreunion-labs.net/ twitter : @mreunionlabs blog : mreunion.wordpress.com Follow our android survey at : http://www.mreunion-labs.net/downloads:dlapk/MySurvey.apk