Lance, I think I'm really close lol. I think my struggles have to do with the concept of having to mock a service.
Anyhow I have the following mock public static PageRenderLinkSource buildPageRenderLinkSource() { PageRenderLinkSource pageRenderLinkSource = Mockito.mock(PageRenderLinkSource.class); when(pageRenderLinkSource.createPageRenderLinkWithContext(TimeSheet.class, ETSSEnum.SUPERVISOR, 1L).toAbsoluteURI()).thenReturn("http://test1"); when(pageRenderLinkSource.createPageRenderLinkWithContext(TimeSheet.class, ETSSEnum.SUPERVISOR, 2L).toAbsoluteURI()).thenReturn("http://test2"); when(pageRenderLinkSource.createPageRenderLinkWithContext(TimeSheet.class, ETSSEnum.SUPERVISOR, 3L).toAbsoluteURI()).thenReturn("http://test3"); when(pageRenderLinkSource.createPageRenderLinkWithContext(TimeSheet.class, ETSSEnum.SUPERVISOR, 4L).toAbsoluteURI()).thenReturn("http://test4"); when(pageRenderLinkSource.createPageRenderLinkWithContext(TimeSheet.class, ETSSEnum.SUPERVISOR, 5L).toAbsoluteURI()).thenReturn("http://test5"); return pageRenderLinkSource; } The service calls it like so @Override public String getTimeSheetURL(TimeSheetEntity timeSheet, ETSSEnum role) { System.out.println(role + " " + timeSheet.getId()); return linkSource.createPageRenderLinkWithContext(TimeSheet.class, role, timeSheet.getId()).toAbsoluteURI(); } And now I get the following exception, any idea what I might be missing? [TestNG] Running: Command line suite [WARN ] (ConfigContext.java:257) - HSEARCH000075: Configuration setting hibernate.search.lucene_version was not specified, using LUCENE_CURRENT. [WARN ] (Config.java:360) - You should not use LUCENE_CURRENT as luceneMatchVersion property: if you use this setting, and then Solr upgrades to a newer release of Lucene, sizable changes may happen. If precise back compatibility is important then you should instead explicitly specify an actual Lucene version. testSendEmailReport size 5 supervisor 1 [ERROR] (OperationTrackerImpl.java:192) - Error invoking method public static org.apache.tapestry5.services.PageRenderLinkSource org.healthresearch.etss.services.AppModuleTest.buildPageRenderLinkSource(): java.lang.NullPointerException [ERROR] (OperationTrackerImpl.java:193) - Operations trace: [ERROR] (OperationTrackerImpl.java:202) - [ 1] Realizing service PageRenderLinkSource [ERROR] (OperationTrackerImpl.java:202) - [ 2] Instantiating service PageRenderLinkSource implementation via org.healthresearch.etss.services.AppModuleTest.buildPageRenderLinkSource() (at AppModuleTest.java:155) [ERROR] (OperationTrackerImpl.java:202) - [ 3] Constructing service implementation via org.healthresearch.etss.services.AppModuleTest.buildPageRenderLinkSource() (at AppModuleTest.java:155) [ERROR] (RecursiveServiceCreationCheckWrapper.java:65) - Construction of service PageRenderLinkSource failed: Error invoking method public static org.apache.tapestry5.services.PageRenderLinkSource org.healthresearch.etss.services.AppModuleTest.buildPageRenderLinkSource(): java.lang.NullPointerException org.apache.tapestry5.ioc.internal.OperationException: Error invoking method public static org.apache.tapestry5.services.PageRenderLinkSource org.healthresearch.etss.services.AppModuleTest.buildPageRenderLinkSource(): java.lang.NullPointerException at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:184) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:90) at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:72) at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1258) at org.apache.tapestry5.ioc.internal.util.ConstructionPlan.createObject(ConstructionPlan.java:61) at org.apache.tapestry5.ioc.internal.ServiceBuilderMethodInvoker.createObject(ServiceBuilderMethodInvoker.java:61) at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:47) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:82) at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:72) at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1258) at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:51) at org.apache.tapestry5.ioc.internal.SingletonServiceLifecycle.createService(SingletonServiceLifecycle.java:30) at org.apache.tapestry5.ioc.internal.LifecycleWrappedServiceCreator.createObject(LifecycleWrappedServiceCreator.java:47) at org.apache.tapestry5.ioc.internal.AdvisorStackBuilder.createObject(AdvisorStackBuilder.java:64) at org.apache.tapestry5.ioc.internal.InterceptorStackBuilder.createObject(InterceptorStackBuilder.java:55) at org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:61) at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:47) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:82) at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:72) at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1258) at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:51) at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:67) at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.createObject(JustInTimeObjectCreator.java:55) at $PageRenderLinkSource_4090b27e85db6.delegate(Unknown Source) at $PageRenderLinkSource_4090b27e85db6.createPageRenderLinkWithContext(Unknown Source) at org.healthresearch.etss.services.email.impl.EmailHelperImpl.getTimeSheetURL(EmailHelperImpl.java:69) at org.healthresearch.etss.services.email.impl.EmailHelperImpl.initiateSupervisorReminder(EmailHelperImpl.java:45) at $EmailHelper_4090b27e85dbd.initiateSupervisorReminder(Unknown Source) at $EmailHelper_4090b27e85dbc.initiateSupervisorReminder(Unknown Source) at org.healthresearch.etss.services.email.impl.EmailServiceImpl.sendSupervisorReminderEmail(EmailServiceImpl.java:123) at $EmailService_4090b27e85db4.sendSupervisorReminderEmail(Unknown Source) at $EmailService_4090b27e85d95.sendSupervisorReminderEmail(Unknown Source) at org.healthresearch.etss.services.email.impl.EmailServiceImplTest.testSendEmailReport(EmailServiceImplTest.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) at org.testng.internal.Invoker.invokeMethod(Invoker.java:702) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) at org.testng.TestRunner.privateRun(TestRunner.java:768) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) at org.testng.SuiteRunner.run(SuiteRunner.java:240) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:87) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1188) at org.testng.TestNG.runSuitesLocally(TestNG.java:1113) at org.testng.TestNG.run(TestNG.java:1025) at org.testng.TestNG.privateMain(TestNG.java:1328) at org.testng.TestNG.main(TestNG.java:1297) Caused by: java.lang.RuntimeException: Error invoking method public static org.apache.tapestry5.services.PageRenderLinkSource org.healthresearch.etss.services.AppModuleTest.buildPageRenderLinkSource(): java.lang.NullPointerException at org.apache.tapestry5.ioc.internal.util.MethodInvoker.invoke(MethodInvoker.java:63) at org.apache.tapestry5.ioc.internal.util.LoggingInvokableWrapper.invoke(LoggingInvokableWrapper.java:43) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:82) ... 54 more Caused by: java.lang.NullPointerException at org.healthresearch.etss.services.AppModuleTest.buildPageRenderLinkSource(AppModuleTest.java:156) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.tapestry5.ioc.internal.util.MethodInvoker.invoke(MethodInvoker.java:52) ... 56 more On Wed, Sep 10, 2014 at 1:14 PM, Lance Java <lance.j...@googlemail.com> wrote: > Ah, ok.. > > Adding the tapestry web module will cause headaches. I suggest you add > builder methods to your test module for the specific web dependencies > required for the service under test. Similar to how the Request is > currently mocked. > On 10 Sep 2014 18:09, "George Christman" <gchrist...@cardaddy.com> wrote: > > > Integration testing. > > > > On Wed, Sep 10, 2014 at 1:06 PM, Lance Java <lance.j...@googlemail.com> > > wrote: > > > > > There's 2 types of tests that I feel are getting blurred here > > > > > > 1. Unit test - tests a single class. All dependencies are mocked > > > > > > 2. Integration test - tests 2 or more services in concert (might > involve > > a > > > tapestry module and an in memory database) > > > > > > Which test are you trying to achieve here? > > > On 10 Sep 2014 17:53, "Lance Java" <lance.j...@googlemail.com> wrote: > > > > > > > Unit tests don't need a module at all. Your colleague could mock the > > > > PageRenderLinkSource using Mockito and pass it to the EmailService > > > > constructor. Then test the hell out of it! > > > > On 10 Sep 2014 17:41, "George Christman" <gchrist...@cardaddy.com> > > > wrote: > > > > > > > >> Thanks Lance, I figured out the DAO issue :) Anyhow this happens to > be > > > my > > > >> day job project and my co-worker is looking to test his generated > > > emails. > > > >> So if I understand you correctly, I need to include the > tapestry-core? > > > If > > > >> so, is that just a mater of including TapestryModule or no? > > > >> > > > >> On Wed, Sep 10, 2014 at 12:29 PM, Lance Java < > > lance.j...@googlemail.com > > > > > > > >> wrote: > > > >> > > > >> > Hi George, PageRenderLinkSource is a part of the web framework. > > > >> > > > > >> > I mentioned before that you could split your app into 2 modules: > > > >> > api - depends on tapestry-ioc > > > >> > web - depends on tapestry-core > > > >> > > > > >> > The test case I setup for you only tests the api stuff > > (tapestry-ioc). > > > >> If > > > >> > you split into 2 modules this would be easy to see (since > > > >> > PageRenderLinkSource would not be on the test classpath). > > > >> > > > > >> > > > >> > > > >> > > > >> -- > > > >> George Christman > > > >> www.CarDaddy.com > > > >> P.O. Box 735 > > > >> Johnstown, New York > > > >> > > > > > > > > > > > > > > > -- > > George Christman > > www.CarDaddy.com > > P.O. Box 735 > > Johnstown, New York > > > -- George Christman www.CarDaddy.com P.O. Box 735 Johnstown, New York