2 Replies Latest reply on Jun 6, 2012 1:16 PM by billm

    Arquillian integration with Spring @Autowired (Tomcat 7.0 Managed)

    billm

      Hi,

       

      How do I construct a class under test where one of it's members use Spring @Autowired in a Tomcat 7.0 Managed implementation?

       

      Example code

       

      Class under test: SearchController:

       

      public class SearchController {

       

      @Autowired

      private SearchService searchService;

       

            public List<Integer> searchDocument(String docId, String phrase) {

                    List<Integer>result = searchService.findPageNumbers(docId, phrase);

                    return result;

            }

       

      }

       

      In this case I want an instance of SearchController.  If I write new SearchController() in my Arquillian test class running in separate JVM, I won't trigger the injection of searchSerivce since the Arquillian test class has no idea of Spring or spring context.   I can't use @Inject(CDI) since it not available for Tomcat 7 Managed.

       

      Thanks,

      Bill

        • 1. Re: Arquillian integration with Spring @Autowired (Tomcat 7.0 Managed)
          jmnarloch

          Hi Bill,

           

          This is what for the Spring Extension has been made - currently in Alpha 1 ver.: https://github.com/arquillian/arquillian-extension-spring

           

          You need to add the extension into your POM:

           

          <dependency>

               <groupId>org.jboss.arquillian.extension</groupId>
               <artifactId>arquillian-service-deployer-spring-3</artifactId>
               <version>1.0.0.Alpha1</version>
               <scope>test</scope>
          </dependency>

           

          Then you make a standard arquillian test, with one difference - annotate it with @SpringConfiguration with location pointing to yours applicationContext.xml.

          Remeber to include the configuration file with the deployment, otherwise the extension won't be able to instantiate the ApplicationContext:

           

          {code}

          archive.addAsResource("applicationContext.xml")

          {code}

           

          The extension should allow to test JAR and WAR archives.

           

          After setting everything up you should be able to autowire you controller in the test case e.g.:

           

           

          {code}

          @RunWith(Arquillian.class)

          @SpringConfiguration("applicationContext.xml")

          public class SearchControllerTest {

           

                @Autowired

                private SearchController searchService;

           

                @Test

                public void testSearchDocument {

           

                         // test code

                }

          }

           

          {code}

           

          Note that you may have to add additional Spring dependencies into the ShrinkWrap deployment.

          • 2. Re: Arquillian integration with Spring @Autowired (Tomcat 7.0 Managed)
            billm

            thanks for the help Jakub and good luck on your efforts this summer.