As Dragan said, you have to add all modules manually. In the thread I've posted a link to above you can find some references, like here:
https://gist.github.com/dmitrygusev/6672859#file-baseintegrationtest-java-L11-L18 Notice, the class also extends AbstractShiroTest, because some additional setup required for shiro and unit testing. On Tue, Jan 21, 2014 at 11:59 PM, George Christman <gchrist...@cardaddy.com>wrote: > Am I going about this all the wrong way? Am I using the services correctly? > I never see in any example test code where you guys are having to add all > the modules. Any suggestions? > > > On Tue, Jan 21, 2014 at 2:47 PM, George Christman > <gchrist...@cardaddy.com>wrote: > > > and that is the easiest way to do it ugh lol > > > > > > On Tue, Jan 21, 2014 at 2:30 PM, Dragan Sahpaski < > > dragan.sahpa...@gmail.com> wrote: > > > >> You have to manually add ALL the tapestry IOC modules you're using (in > >> this > >> case the tapestry-security module > >> org.tynamo.security.services.SecurityModule), because you're starting > only > >> the Registry and not the entire webapp. > >> > >> Cheers, > >> Dragan Sahpaski > >> > >> > >> On Tue, Jan 21, 2014 at 8:22 PM, George Christman > >> <gchrist...@cardaddy.com>wrote: > >> > >> > Dmitry, I'm very confused. I use constructor injection in my services > >> which > >> > I always thought was the correct way to do it based on the tap docs. > >> > > >> > I have the following test class where I'm trying to use a service. > >> > > >> > public class TimeSheetServiceTest { > >> > > >> > protected static TimeSheetService timeSheetService; > >> > > >> > @BeforeClass > >> > public static void setup() { > >> > Registry registry; > >> > RegistryBuilder builder = new RegistryBuilder(); > >> > builder.add(AppModule.class); > >> > registry = builder.build(); > >> > registry.performRegistryStartup(); > >> > timeSheetService = > registry.getService(TimeSheetService.class); > >> > } > >> > > >> > @Test > >> > public void testService() { > >> > int result = > >> > > >> > timeSheetService.getHolidayListForPayPeriod(Calendar.getInstance()).size(); > >> > System.out.println("result " + result); > >> > } > >> > > >> > } > >> > > >> > TimeSheetService injects another service called UserInfoService > userInfo > >> > like so, > >> > > >> > public class TimeSheetServiceImpl implements TimeSheetService { > >> > > >> > public TimeSheetServiceImpl(UserInfoService userInfo) { > >> > this.userInfo = userInfo; > >> > } > >> > > >> > } > >> > > >> > When I try running my test class, I get the following exception. > >> > > >> > <?xml version="1.0" encoding="UTF-8"?> > >> > > >> > <!-- Generated by org.testng.reporters.JUnitReportReporter --> > >> > -<testsuite errors="0" time="0.000" timestamp="21 Jan 2014 19:18:58 > GMT" > >> > failures="1" tests="1" > >> > name="org.domain.etss.services.form.TimeSheetServiceTest" > >> > hostname="hri185169"> > >> > <!-- org.domain.etss.services.form.TimeSheetServiceTest --> > >> > -<testcase time="0.000" name="testService" > >> > > classname="org.domain.etss.services.form.TimeSheetServiceTest">-<failure > >> > message="Contribution > >> > > >> > > >> > org.domain.etss.services.AppModule.contributeSecurityConfiguration(Configuration, > >> > SecurityFilterChainFactory) (at AppModule.java:312) is for service > >> > 'SecurityConfiguration', which does not exist." > >> > type="java.lang.IllegalArgumentException"> > >> > <![CDATA[java.lang.IllegalArgumentException: Contribution > >> > > >> > > >> > org.domain.etss.services.AppModule.contributeSecurityConfiguration(Configuration, > >> > SecurityFilterChainFactory) (at AppModule.java:312) is for service > >> > 'SecurityConfiguration', which does not exist. at > >> > > >> > > >> > org.apache.tapestry5.ioc.internal.RegistryImpl.validateContributeDefs(RegistryImpl.java:236) > >> > at > >> > > >> > > >> > org.apache.tapestry5.ioc.internal.RegistryImpl.<init>(RegistryImpl.java:200) > >> > at > >> org.apache.tapestry5.ioc.RegistryBuilder.build(RegistryBuilder.java:170) > >> > at > >> > > >> > > >> > org.domain.etss.services.form.TimeSheetServiceTest.setup(TimeSheetServiceTest.java:28) > >> > 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.invokeConfigurationMethod(Invoker.java:551) > >> > at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213) > at > >> > org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138) at > >> > > >> > > >> > org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175) > >> > at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107) > >> 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.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:72) > >> > at > >> > > >> > > >> > org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:88) > >> > at > >> > > >> > > >> > org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:101) > >> > 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.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) > >> > at com.sun.proxy.$Proxy0.invoke(Unknown Source) at > >> > > >> > > >> > org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150) > >> > at > >> > > >> > > >> > org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91) > >> > at > >> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) > >> > ]]> > >> > </failure></testcase> > >> > <!-- testService --> > >> > </testsuite> > >> > > >> > From this line > >> > > >> > public static void > >> > contributeSecurityConfiguration(Configuration<SecurityFilterChain> > >> > configuration, > >> > > >> > SecurityFilterChainFactory factory) { > >> > > >> > > >> > configuration.add(factory.createChain("/employee/**").add(factory.roles(), > >> > "employee").build()); > >> > > configuration.add(factory.createChain("/").add(factory.roles(), > >> > "user").build()); > >> > } > >> > > >> > What am I missing? > >> > > >> > > >> > On Tue, Jan 21, 2014 at 1:00 PM, Dmitry Gusev <dmitry.gu...@gmail.com > >> > >wrote: > >> > > >> > > Right, this is for integration testing. I use mocking too, but > rarely > >> -- > >> > my > >> > > tests are 80% integration ones and involve DB (the same as in > >> > production). > >> > > For mocks I have to use constructor injection also, and this is the > >> only > >> > > reason why I use constructor injections. > >> > > The code looks ugly in this cases, though, when you have more than 5 > >> > > dependencies per service. And it's also a tedious task when you want > >> to > >> > add > >> > > another dependency to the service, because you have to update all > test > >> > > clients also. That's why I prefer @Inject. > >> > > > >> > > It would be nice to have some api to override, decorate, and advise > >> some > >> > > services on existing (built) registry instance right in the test > >> method. > >> > > Maybe (temporarily) replace some service with a mock. So that I > won't > >> > have > >> > > to build new module just to override one service for one test case, > >> > because > >> > > it requires additional setup. Just a thoughts. > >> > > > >> > > > >> > > On Tue, Jan 21, 2014 at 9:41 PM, Dragan Sahpaski > >> > > <dragan.sahpa...@gmail.com>wrote: > >> > > > >> > > > I agree with Dimitry but thats more for integration like testing. > >> > > > For basic unit testing of services methods (usually we unit test a > >> > single > >> > > > method per test) we mock the dependencies (the injected services) > >> and > >> > > pass > >> > > > the mocks through the constructor of the service implementation > >> class > >> > > under > >> > > > test. That's why we prefer constructor based injection. > >> > > > > >> > > > If we need to mock methods in the service that's being bested than > >> we > >> > > > usually use Spy in Spock or the equivalent feature in other mock > >> > > > frameworks. > >> > > > > >> > > > Cheers, > >> > > > Dragan Sahpaski > >> > > > > >> > > > > >> > > > On Tue, Jan 21, 2014 at 6:34 PM, Dmitry Gusev < > >> dmitry.gu...@gmail.com > >> > > > >wrote: > >> > > > > >> > > > > I usually create base class where I construct registry instance, > >> > then I > >> > > > use > >> > > > > registry.getService(Intf.class) when I need an instance of a > >> service. > >> > > > > > >> > > > > Like here: > >> > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > https://github.com/anjlab/anjlab-tapestry-commons/blob/master/anjlab-tapestry-quartz/src/test/java/com/anjlab/tapestry5/services/quartz/SchedulerTest.java > >> > > > > > >> > > > > > >> > > > > On Tue, Jan 21, 2014 at 9:07 PM, George Christman > >> > > > > <gchrist...@cardaddy.com>wrote: > >> > > > > > >> > > > > > Hello, we are trying to unit test our services, but our > services > >> > > > contain > >> > > > > > other injected services. I'm wondering how you test injected > >> > > services. > >> > > > Is > >> > > > > > there a configuration I'm missing? > >> > > > > > > >> > > > > > -- > >> > > > > > George Christman > >> > > > > > www.CarDaddy.com > >> > > > > > P.O. Box 735 > >> > > > > > Johnstown, New York > >> > > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > -- > >> > > > > Dmitry Gusev > >> > > > > > >> > > > > AnjLab Team > >> > > > > http://anjlab.com > >> > > > > > >> > > > > >> > > > >> > > > >> > > > >> > > -- > >> > > Dmitry Gusev > >> > > > >> > > AnjLab Team > >> > > http://anjlab.com > >> > > > >> > > >> > > >> > > >> > -- > >> > 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 > -- Dmitry Gusev AnjLab Team http://anjlab.com