Need(le) for Speed - Effective Unit Testing for Java EE

20

description

Needle is a lightweight framework for testing Java EE components outside of the container in isolation. It reduces the test setup code by analysing dependencies and automatic injection of mock objects. It will thus maximize the speed of development as well as the execution of unit tests.

Transcript of Need(le) for Speed - Effective Unit Testing for Java EE

Page 1: Need(le) for Speed - Effective Unit Testing for Java EE
Page 2: Need(le) for Speed - Effective Unit Testing for Java EE

Logo auf dunklen Hintergrund (z.B. Website)

Logo auf hellem Hintergrund

Logo in Graustufen

Logo in Schwarz/Weiss

NEEDLEfor Java EE

NEEDLEfor Java EE

NEEDLEfor Java EE

NEEDLEfor Java EE

Effective Unit Testing of Java EE

[email protected] [email protected]

Page 3: Need(le) for Speed - Effective Unit Testing for Java EE
Page 4: Need(le) for Speed - Effective Unit Testing for Java EE

Why do we Test?

•  Confidence •  Cost Reduction •  Better Design •  Documentation •  Less Debug Time

Page 5: Need(le) for Speed - Effective Unit Testing for Java EE

The Levels of Testing Logo auf dunklen Hintergrund (z.B. Website)

Logo auf hellem Hintergrund

Logo in Graustufen

Logo in Schwarz/Weiss

NEEDLEfor Java EE

NEEDLEfor Java EE

NEEDLEfor Java EE

NEEDLEfor Java EE

•  Unit •  Integration •  Acceptance •  Exploratory

Page 6: Need(le) for Speed - Effective Unit Testing for Java EE

Need(le) for Speed

•  out of container testing •  test components in isolation

•  reduce test setup code •  analyze dependencies

and provide mocks

•  fast in development and execution

Page 7: Need(le) for Speed - Effective Unit Testing for Java EE

Basic Test

initialized object under test instance with injected

dependencies

Needle JUnit Rule to instantiate and initialize the objects under test.

Provides access to dependencies

of the the objects under test

Page 8: Need(le) for Speed - Effective Unit Testing for Java EE

Needle Testcase

•  Instantiation of @ObjectUnderTest Components

•  Dependency Injection – Field – Method – Constuctor

•  Default are Mock Objects

Page 9: Need(le) for Speed - Effective Unit Testing for Java EE

Injection Provider

•  Out-of-the-box –  @Inject, @EJB, @Resource, @PersistenceContext, @PersistenceUnit

•  Configuration of additional Annotations – e.g. Seam 2

•  Configuration of additional injection provider – e.g. javax.inject.Qualifier

Page 10: Need(le) for Speed - Effective Unit Testing for Java EE

Custom Injection Provider

Page 11: Need(le) for Speed - Effective Unit Testing for Java EE

Custom Injection Provider 1.  NeedleRule

2.  needle.properties

custom.injection.annotations=org.jboss.seam.annotations.In, org.jboss.seam.annotations.Logger

custom.injection.provider.classes=de.akquinet.judcon.CurrentUserInjectionProvider

Page 12: Need(le) for Speed - Effective Unit Testing for Java EE

Testing an Object Graph

•  Provide own objects •  Wiring complex object graph

@InjectInto

@InjectIntoMany

<ObjectUnderTest>UserDao

UserDaoSercurityLogging

<ObjectUnderTest>Authenticator

<ObjectUnderTest>Security

<Mock><Mock>

Page 13: Need(le) for Speed - Effective Unit Testing for Java EE

Testing an Object Graph

<ObjectUnderTest>UserDao

UserDaoSercurityLogging

<ObjectUnderTest>Authenticator

<ObjectUnderTest>Security

<Mock><Mock>

public class AuthenticatorTest { @Rule public NeedleRule needleRule = new NeedleRule(); @ObjectUnderTest private Authenticator authenticator; @ObjectUnderTest @InjectInto(targetComponentId=“authenticator“) private UserDaoBean userDao; @InjectIntoMany private Security security; @Test public void test () throws Exception { ... } } @Test public void testFindVehicleNameByPrimaryKey() { final Vehicle vehicle = new VehicleTestdataBuilder(databaseRule.getEntityManager()).withName("vehicleName") .buildAndSave(); String result = beanToTest.findVehicleNameByPk(vehicle.getId()); assertEquals(vehicle.getName(), result); }

Page 14: Need(le) for Speed - Effective Unit Testing for Java EE

Mock Objects public class AuthenticatorTest { @Rule public NeedleRule needleRule = new NeedleRule(); @ObjectUnderTest private Authenticator authenticator; private EasyMockProvider mockProvider = needleRule.getMockProvider();

@Test public void test () throws Exception { UserDao userDaoMock = needleRule.getInjectedObject(UserDao.class); EasyMock.expect(userDaoMock.find((String)EasyMock.anyObject())); ... mockProvider.replayAll(); authenticator.authenticate(); mockProvider.verifyAll(); } } @Test public void testFindVehicleNameByPrimaryKey() { final Vehicle vehicle = new VehicleTestdataBuilder(databaseRule.getEntityManager()).withName("vehicleName") .buildAndSave(); String result = beanToTest.findVehicleNameByPk(vehicle.getId()); assertEquals(vehicle.getName(), result); }

An EasyMock specific MockProvider.

Inherits from EasyMockSupport.

Access to injected dependencies.

Page 15: Need(le) for Speed - Effective Unit Testing for Java EE

Database Testing

•  via JPA Provider, e.g. EclipseLink or Hibernate

•  EntityManager creation and injection •  Transaction Utilities

•  Optional: Execute Database operation on test setup and teardown –  Import SQL Scripts – Deleting test data after the test execution

Page 16: Need(le) for Speed - Effective Unit Testing for Java EE

public class UserDaoTest { @Rule public DatabaseRule dbRule = new DatabaseRule(); @Rule public NeedleRule needleRule = new NeedleRule(dbRule); @ObjectUnderTest(implementation = UserDaoBean.class) private UserDao userDao; @Test public void testFind() throws Exception { User user = new UserTestdataBuilder( dbRule.getEntityManager()).withName("kbeck") .buildAndSave(); User userFromDb = userDao.find("kbeck"); assertEquals(...); } } @Test public void testFindVehicleNameByPrimaryKey() { final Vehicle vehicle = new VehicleTestdataBuilder(databaseRule.getEntityManager()).withName("vehicleName") .buildAndSave(); String result = beanToTest.findVehicleNameByPk(vehicle.getId()); assertEquals(vehicle.getName(), result); }

Provides access to the database via JPA.

Execute DB Operations

Injection Provider of the EntityManger

Creates and persist an user object

Page 17: Need(le) for Speed - Effective Unit Testing for Java EE

Summary

•  Fast •  Less Glue Code •  Keep Dependencies Private •  Extensible •  Developer Happiness ;-)

Page 18: Need(le) for Speed - Effective Unit Testing for Java EE

Get Started Today!

<dependency> <groupId>de.akquinet.jbosscc</groupId>

<artifactId>jbosscc-needle</artifactId> <version>2.0</version>

<scope>test</scope> </dependency>

Page 19: Need(le) for Speed - Effective Unit Testing for Java EE

http://needle.spree.de http://sourceforge.net/projects/jbosscc-needle/

[email protected] [email protected]

http://blog.akquinet.de/

Logo auf dunklen Hintergrund (z.B. Website)

Logo auf hellem Hintergrund

Logo in Graustufen

Logo in Schwarz/Weiss

NEEDLEfor Java EE

NEEDLEfor Java EE

NEEDLEfor Java EE

NEEDLEfor Java EE

Page 20: Need(le) for Speed - Effective Unit Testing for Java EE

Q&A