In this session, we introduce the Java developer to the Arquillian framework, Gradle and the Enterprise container technologies in Java EE 7. As a lucrative bonus we will cover building EJB and Java EE 7 tests applications with Gradle, the latest and greatest build framework for the Java platform, which improves on Apache Maven. The Java EE specification full contains three different containers, namely the Web, the EJB and the CDI containers. All of them can be reached using the Arquillian Framework, and this means there is now one general testing framework, which developers should learn as part of their professional duties. The session will cover writing meaningful tests for CDI, EJB and JAX-RS. Along the way, we will introduce new features of EJB 3.2, CDI 1.1 and RESTful Services. GlassFish Embedded Container 4.0 will be demonstrated.
Devoxx UK 2013 Test-Driven Development with JavaEE 7, Arquillian and Embedded Containers
1.
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
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
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
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;
}
/* ... */
}
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/