SlideShare a Scribd company logo
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded Containers
Test Driven Development with
   Java EE 7, Arquillian and
    Enterprise Containers	





            Peter Pilgrim	

    Java Champion, Software Developer	

          Independent Contractor	

           @peter_pilgrim
Biography

 ■  Completed Java Sybase course in 1998	

 ■  Working as an Independent
    Contractor 	

 ■  Founded JAVAWUG 2004-2010	

 ■  Blue-chip business and Banking: IT,
    Deutsche, Credit Suisse, UBS, Lloyds
    Banking	




                                              3
The Java EE 7 Developer User Guide
           Written by Peter Pilgrim	

            Late Summer 2013
Agile Software Development?
Why do we test?
Architectural Competencies

    Performance and Efficiency	



    Stability and Robustness	



    Maintainability and Refactor-ability
Tools of the Trade
 § Frameworks: JUnit, TestNG and XUnit; JBehave, Spock, ScalaTest 	

 § Integrated Development Environment and Selenium
How do we test?
The Test Driven Cycle
                                              Write A
                                             Failing Test	


           Ensure All                                                          Make The
           Tests Pass	

                                                       Test Pass	




                     Refactor the                              Refactor the
                      Main Code	

                                 Test	



"Oh, East is East, and West is West, and never the twain shall meet.”, Rudyard Kipling, 1892
Essentials of Block Testing



    Assign	

      Act	

     Assert
Traditional Java Enterprise Testing

     Outside of the Container	


      Mock and Stub objects	


     Writing Tests around Deployment
Java EE 7
Java EE 7 Framework Updates
 Interface Boundary        Management and    Web and HTML
      Endpoints     	

	

    Storage	

    Service Endpoints	

      JAX RS 2.0	

          EJB 3.2	

         Servlet 3.1	

                                              WebSocket 1.0	

        JMS 2.0	

           CDI 1.1	

                                                  JSF 2.2	

  Bean Validation 1.1	

     JPA 2.1	

          JSON 1.0
Time to Change JavaEE Testing
Open Source Integration Testing
 Peter Muir, David Blewin and Aslak Knutsen and from Red Hat JBoss.
Arquillian Test Framework


    Portable In-Container Integration Testing	



    Deployment of Unit Test and Dependencies together	



    Extension of Existing Test Framework Support
Shrink Wrap

   An Aid to Better Test Enterprise Components	



   “What if we could declare, in Java, an object to
   represent that archive?”	



   Builder pattern for Virtual JAR file
Context & Dependency Injection 1.1

    Inject Beans in strongly typed manner	



    Contextual Scopes, Qualifiers and Providers	



    Life-cycle, Event Management and Event Listeners
Gradle Dependencies I
  dependencies {
	

     compile     'org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:
        1.0.0.Alpha1'
	

        compile     'org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec:1.0.0.Alpha2'
	

        compile     'javax.enterprise:cdi-api:1.1-PFD’
	

        compile     'javax.validation:validation-api:1.1.0.CR3'
	

        compile     'org.hibernate:hibernate-validator:5.0.0.CR4'
	

        compile     'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Draft-14'
	

        runtime     'org.glassfish.main.extras:glassfish-embedded-all:4.0-b81’
	

        testCompile 'org.jboss.arquillian.junit:arquillian-junit-container:1.0.3.Final'
	

        testCompile 'org.jboss.arquillian.container:arquillian-glassfish-
	

     embedded-3.1:1.0.0.Final-SNAPSHOT'
	

     testCompile 'junit:junit:4.11'
	

 }
Gradle Dependencies II
  dependencies {
	

     //...
	

     compile     'javax:javaee-api:7.0-b81'
	

     runtime     'javax:javaee-api:7.0-b81'
	

     //...
	

     testCompile 'junit:junit:4.11'
	

 }
Arquillian Test Structure I
 @RunWith(Arquillian.class)
	

 public class BasicUserDetailRepositoryTest {
	

     @Deployment
	

     public static JavaArchive createDeployment() {
	

         JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
	

                 .addClasses(BasicUserDetailRepository.class,

	

                         UserDetailRepository.class, User.class)

	

                 .addAsManifestResource(

	

                         EmptyAsset.INSTANCE, "beans.xml");
            return jar;
	

        }
	

        /* ... */
	

	

 }
Arquillian Test Structure II
 @RunWith(Arquillian.class)
	

 public class BasicUserDetailRepositoryTest {     /* ... */
	

     @Inject
	

     private UserDetailRepository userDetailRepo;
	

	

     @Test
	

     public void shouldCreateUserInRepo() {
	

         User user = new User("frostj", "Jack", "Frost");
	

         assertFalse( userDetailRepo.containsUser(user ));
	

         userDetailRepo.createUser(user);
	

         assertTrue( userDetailRepo.containsUser(user ));
	

     }
	

 }
Demo: Arquillian


Context Dependency & Injection
Enterprise Java Beans 3.2
    Session Beans as Java Co-Located or Remote
    Service Endpoints	


    Transaction Support	


    Lifecycle Event Management, Interception and
    Containment	


    Endpoints Extended to Web Services, JAX-RS and/
    or WebSockets
Demo: Arquillian


Enterprise Java Beans
HTML5 Java WebSocket 1.0
   WebSocket connections are peer full-duplex
   HTTP interactions over a session	


   Reduced payload and lower latency	


   Designed for asynchronous operations,
   performance and Efficiency
Demo: Arquillian


Java WebSocket API 1.0
Embeddable Containers

   So-called “Container-less” Web Application	




   Deliver an Container Embedded in Application	



   You Have Control: Size, Framework and
   Libraries
GlassFish Embedded Initialization
  public class AbstractEmbeddedRunner {
	

      private int port;
	

      private GlassFish glassfish;
	

	

      public AbstractEmbeddedRunner init() throws Exception{
	

         BootstrapProperties bootstrapProperties = new BootstrapProperties();

	

          GlassFishRuntime glassfishRuntime =

	

              GlassFishRuntime.bootstrap(bootstrapProperties);

	

          GlassFishProperties glassfishProperties = new GlassFishProperties();
             glassfishProperties.setPort("http-listener", port);
	

	

 //         glassfishProperties.setPort("https-listener", port+1);
             glassfish = glassfishRuntime.newGlassFish(glassfishProperties);
	

             return this; } /* ... */
	

  }
GlassFish Embedded Start and Stop
  public class AbstractEmbeddedRunner {
	

     /* ... */
	

     public AbstractEmbeddedRunner start() throws Exception{
	

          glassfish.start();
	

          return this;
	

      }

	

	

      public AbstractEmbeddedRunner stop() throws Exception{

	

          glassfish.stop();
             return this;
	

         } /* ... */
	

	

 }
GlassFish Embedded Deploy WAR
  public class AbstractEmbeddedRunner {
	

     /* ... */
	

     public AbstractEmbeddedRunner deploy( String args[]) throws Exception{
	

          Deployer deployer = glassfish.getDeployer();
	

          for (String s: args) {
	

                 String application = deployer.deploy(new File(s));

	

                 System.out.printf("deploying "+application);

	

          }

	

          return this;
         }
	

         /* ... */
	

	

 }
Demo: GlassFish Embedded


GlassFish 4.0 Embedded Server
Heavyweight vs. Lightweight



   How on earth do you weigh 	

  a Java container of any type?
Developer Summary
What You Will Do Tomorrow?

                       Why
                       Mock?	



        Test
    Philosophy	

   CHANGE!	

       Arquillian	




                     Embedded
                     Containers
Resources
 § Arquillian Integration Server http://arquillian.org/	

 § Java EE 7 Specification http://jcp.org/en/jsr/detail?id=342	

 § Java Web Socket API 1.0 http://java.net/projects/websocket-spec/downloads 	

 § GlassFish 4.0 Promoted Builds https://blogs.oracle.com/theaquarium/entry/
    downloading_latest_glassfish_4_promoted	

 § WebSocket Client http://www.websocket.org/echo.html	

 § GlassFish Embedded Instructions http://embedded-glassfish.java.net/	

 § Thanks!
Creative Commons Attributions
 §  Brett Lider, Folded Ruler, http://www.flickr.com/photos/brettlider/1575417754/sizes/o/in/
   photostream/ 	

 §  Daquella manera, Crutches donation to Haitian brothers and sisters, http://www.flickr.com/
   photos/daquellamanera/4390506017/sizes/l/in/photostream/ 	

 §  Marcus Tschiae, Electric Power Framework perspective http://www.flickr.com/photos/tschiae/
   8417927326/sizes/h/	

 §  Falk Neumman, September 5, 2005, You’ve Got A Fast Car, http://www.flickr.com/photos/
   coreforce/5910961411/ 	

 §  Stuart Webster, London skies from Waterloo Bridge, http://www.flickr.com/photos/
   stuartwebster/4192629903/sizes/o/
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded Containers

More Related Content

Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded Containers

  • 2. Test Driven Development with Java EE 7, Arquillian and Enterprise Containers Peter Pilgrim Java Champion, Software Developer Independent Contractor @peter_pilgrim
  • 3. Biography ■  Completed Java Sybase course in 1998 ■  Working as an Independent Contractor ■  Founded JAVAWUG 2004-2010 ■  Blue-chip business and Banking: IT, Deutsche, Credit Suisse, UBS, Lloyds Banking 3
  • 4. The Java EE 7 Developer User Guide Written by Peter Pilgrim Late Summer 2013
  • 6. Why do we test?
  • 7. Architectural Competencies Performance and Efficiency Stability and Robustness Maintainability and Refactor-ability
  • 8. Tools of the Trade § Frameworks: JUnit, TestNG and XUnit; JBehave, Spock, ScalaTest § Integrated Development Environment and Selenium
  • 9. How do we test?
  • 10. The Test Driven Cycle Write A Failing Test Ensure All Make The Tests Pass Test Pass Refactor the Refactor the Main Code Test "Oh, East is East, and West is West, and never the twain shall meet.”, Rudyard Kipling, 1892
  • 11. Essentials of Block Testing Assign Act Assert
  • 12. Traditional Java Enterprise Testing Outside of the Container Mock and Stub objects Writing Tests around Deployment
  • 14. Java EE 7 Framework Updates Interface Boundary Management and Web and HTML Endpoints Storage Service Endpoints JAX RS 2.0 EJB 3.2 Servlet 3.1 WebSocket 1.0 JMS 2.0 CDI 1.1 JSF 2.2 Bean Validation 1.1 JPA 2.1 JSON 1.0
  • 15. Time to Change JavaEE Testing
  • 16. Open Source Integration Testing Peter Muir, David Blewin and Aslak Knutsen and from Red Hat JBoss.
  • 17. Arquillian Test Framework Portable In-Container Integration Testing Deployment of Unit Test and Dependencies together Extension of Existing Test Framework Support
  • 18. Shrink Wrap An Aid to Better Test Enterprise Components “What if we could declare, in Java, an object to represent that archive?” Builder pattern for Virtual JAR file
  • 19. Context & Dependency Injection 1.1 Inject Beans in strongly typed manner Contextual Scopes, Qualifiers and Providers Life-cycle, Event Management and Event Listeners
  • 20. Gradle Dependencies I dependencies { compile 'org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec: 1.0.0.Alpha1' compile 'org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec:1.0.0.Alpha2' compile 'javax.enterprise:cdi-api:1.1-PFD’ compile 'javax.validation:validation-api:1.1.0.CR3' compile 'org.hibernate:hibernate-validator:5.0.0.CR4' compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Draft-14' runtime 'org.glassfish.main.extras:glassfish-embedded-all:4.0-b81’ testCompile 'org.jboss.arquillian.junit:arquillian-junit-container:1.0.3.Final' testCompile 'org.jboss.arquillian.container:arquillian-glassfish- embedded-3.1:1.0.0.Final-SNAPSHOT' testCompile 'junit:junit:4.11' }
  • 21. Gradle Dependencies II dependencies { //... compile 'javax:javaee-api:7.0-b81' runtime 'javax:javaee-api:7.0-b81' //... testCompile 'junit:junit:4.11' }
  • 22. Arquillian Test Structure I @RunWith(Arquillian.class) public class BasicUserDetailRepositoryTest { @Deployment public static JavaArchive createDeployment() { JavaArchive jar = ShrinkWrap.create(JavaArchive.class) .addClasses(BasicUserDetailRepository.class, UserDetailRepository.class, User.class) .addAsManifestResource( EmptyAsset.INSTANCE, "beans.xml"); return jar; } /* ... */ }
  • 23. Arquillian Test Structure II @RunWith(Arquillian.class) public class BasicUserDetailRepositoryTest { /* ... */ @Inject private UserDetailRepository userDetailRepo; @Test public void shouldCreateUserInRepo() { User user = new User("frostj", "Jack", "Frost"); assertFalse( userDetailRepo.containsUser(user )); userDetailRepo.createUser(user); assertTrue( userDetailRepo.containsUser(user )); } }
  • 25. Enterprise Java Beans 3.2 Session Beans as Java Co-Located or Remote Service Endpoints Transaction Support Lifecycle Event Management, Interception and Containment Endpoints Extended to Web Services, JAX-RS and/ or WebSockets
  • 27. HTML5 Java WebSocket 1.0 WebSocket connections are peer full-duplex HTTP interactions over a session Reduced payload and lower latency Designed for asynchronous operations, performance and Efficiency
  • 29. Embeddable Containers So-called “Container-less” Web Application Deliver an Container Embedded in Application You Have Control: Size, Framework and Libraries
  • 30. GlassFish Embedded Initialization public class AbstractEmbeddedRunner { private int port; private GlassFish glassfish; public AbstractEmbeddedRunner init() throws Exception{ BootstrapProperties bootstrapProperties = new BootstrapProperties(); GlassFishRuntime glassfishRuntime = GlassFishRuntime.bootstrap(bootstrapProperties); GlassFishProperties glassfishProperties = new GlassFishProperties(); glassfishProperties.setPort("http-listener", port); // glassfishProperties.setPort("https-listener", port+1); glassfish = glassfishRuntime.newGlassFish(glassfishProperties); return this; } /* ... */ }
  • 31. GlassFish Embedded Start and Stop public class AbstractEmbeddedRunner { /* ... */ public AbstractEmbeddedRunner start() throws Exception{ glassfish.start(); return this; } public AbstractEmbeddedRunner stop() throws Exception{ glassfish.stop(); return this; } /* ... */ }
  • 32. GlassFish Embedded Deploy WAR public class AbstractEmbeddedRunner { /* ... */ public AbstractEmbeddedRunner deploy( String args[]) throws Exception{ Deployer deployer = glassfish.getDeployer(); for (String s: args) { String application = deployer.deploy(new File(s)); System.out.printf("deploying "+application); } return this; } /* ... */ }
  • 33. Demo: GlassFish Embedded GlassFish 4.0 Embedded Server
  • 34. Heavyweight vs. Lightweight How on earth do you weigh a Java container of any type?
  • 36. What You Will Do Tomorrow? Why Mock? Test Philosophy CHANGE! Arquillian Embedded Containers
  • 37. Resources § Arquillian Integration Server http://arquillian.org/ § Java EE 7 Specification http://jcp.org/en/jsr/detail?id=342 § Java Web Socket API 1.0 http://java.net/projects/websocket-spec/downloads § GlassFish 4.0 Promoted Builds https://blogs.oracle.com/theaquarium/entry/ downloading_latest_glassfish_4_promoted § WebSocket Client http://www.websocket.org/echo.html § GlassFish Embedded Instructions http://embedded-glassfish.java.net/ § Thanks!
  • 38. Creative Commons Attributions §  Brett Lider, Folded Ruler, http://www.flickr.com/photos/brettlider/1575417754/sizes/o/in/ photostream/ §  Daquella manera, Crutches donation to Haitian brothers and sisters, http://www.flickr.com/ photos/daquellamanera/4390506017/sizes/l/in/photostream/ §  Marcus Tschiae, Electric Power Framework perspective http://www.flickr.com/photos/tschiae/ 8417927326/sizes/h/ §  Falk Neumman, September 5, 2005, You’ve Got A Fast Car, http://www.flickr.com/photos/ coreforce/5910961411/ §  Stuart Webster, London skies from Waterloo Bridge, http://www.flickr.com/photos/ stuartwebster/4192629903/sizes/o/