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
Biography
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
Make The Test Pass
Refactor the Test
Refactor the Main Code
Ensure All Tests Pass
"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 Endpoints
JAX RS 2.0
JMS 2.0
Bean Validation 1.1
Management and Storage
EJB 3.2
CDI 1.1
JPA 2.1
Web and HTML Service Endpoints
Servlet 3.1
WebSocket 1.0
JSF 2.2
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?
CHANGE!
Why Mock?
Arquillian
Embedded Containers
Test Philosophy
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/