devoxx uk 2013 test-driven development with javaee 7, arquillian and embedded containers

Post on 15-May-2015

3.143 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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.

TRANSCRIPT

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/

top related