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

•  Version  2.0  

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

h-p://needle.spree.de/  

Need(le)  for  Speed  –  Effec<ve  Unit  Tes<ng  for  Java  EE    

Heinz  Wilming,  akquinet  AG  

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

•  Version  2.0   h-p://needle.spree.de/  

Mo<va<on  

Why  do  we  Test?  §  Confidence §  Cost  Reduc<on  §  Be-er  Design  §  Documenta<on  §  Less  Debug  Time  

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

•  Version  2.0   h-p://needle.spree.de/  

The  levels  of  tes0ng  §  Unit  §  Integra<on  §  Acceptance    

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  tes<ng  

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

•  Version  2.0   h-p://needle.spree.de/  

Run0me  environment  

Unit  tes<ng  

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

•  Version  2.0   h-p://needle.spree.de/  

Unit-­‐Test  environment  

Unit  tes<ng  

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

•  Version  2.0   h-p://needle.spree.de/  

Unit-­‐Test  environment  

new ShoppingCart();

OrderDao mock = mock(OrderDao.class);

Unit  tes<ng  

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

•  Version  2.0   h-p://needle.spree.de/  

public class ShoppingCart {

@Inject protected OrderDao orderDao;

...

}

Breaking  the  encapsula0on  

Unit  tes<ng  

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

•  Version  2.0   h-p://needle.spree.de/  

public class ShoppingCart {

@Inject private OrderDao orderDao;

...

             /*        *  for  unit  test  only        */

protected void setOrderDao(OrderDao dao){ orderDao = dao; } }

Breaking  the  encapsula0on  

Unit  tes<ng  

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

•  Version  2.0   h-p://needle.spree.de/  

public class ShoppingCartTest {

private ShoppingCart shoppingCart; private OrderDao mock;

@Before public void setup() throws Exception { shoppingCart = new ShoppingCartService(); mock = mock(OrderDao.class); Field field = ShoppingCart.class.getDeclaredField("orderDao"); field.setAccessible(true); field.set(shoppingCart, mock); } @Test public void testCheckout() { ... } }

Using  reflec0on  

Unit  tes<ng  

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

•  Version  2.0   h-p://needle.spree.de/  

Effec0ve  Unit  Tes0ng  for  Java  EE  §  out  of  container  tes<ng  §  test  components  in  isola<on  

§  reduce  test  setup  code  §  analyze  dependencies    

and  provide  mocks  

§  Fast  in  development  and  execu<on  

Need(le)  for  Speed  

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

•  Version  2.0   h-p://needle.spree.de/  

Need(le)  for  Speed  

public class ShoppingCartTest {

@Rule public NeedleRule needleRule = new NeedleRule();

@ObjectUnderTest private ShoppingCart shoppingCart;

@Test public void testCheckout() { boolean checkout = shoppingCart.checkout(); assertTrue(checkout); } }

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

•  Version  2.0   h-p://needle.spree.de/  

Instan<a<on  of  @ObjectUnderTest  Components    

Dependency  Injec<on  §  Field  §  Method  §  Constuctor  

Default  are  Mock  Objects  

Need(le)  for  Speed  

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

•  Version  2.0   h-p://needle.spree.de/  

Out-­‐of-­‐the-­‐box  @Inject, @EJB, @Resource, @PersistenceContext, @PersistenceUnit

Configura<on  of  addi<onal  Annota<ons  §  e.g.  Seam  2  -­‐  @In,@Logger    

Configura<on  of  addi<onal  injec<on  provider  §  e.g. javax.inject.Qualifier

Need(le)  for  Speed  

Injec0on  Provider  

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

•  Version  2.0   h-p://needle.spree.de/  

Need(le)  for  Speed  

Mock  injec0on  public class ShoppingCartTest { @Rule public NeedleRule needleRule = new NeedleRule(); @ObjectUnderTest private ShoppingCart shoppingCart; @Inject private OrderDao orderDaoMock; @Test public void testCheckout() { when(orderDaoMock.find(anyLong())).thenReturn(new Order()); boolean checkout = shoppingCart.checkout(); assertTrue(checkout); } }

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

•  Version  2.0   h-p://needle.spree.de/  

Need(le)  for  Speed  

Tes0ng  object  graphs  Provide  own  objects    

Mul<ple    @ObjectUnderTest  Components  Wiring  complex  object  graph  §  @InjectInto §  @InjectIntoMany  

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

•  Version  2.0   h-p://needle.spree.de/  

Need(le)  for  Speed  

Database  tes0ng  via  JPA  Provider,  e.g.  EclipseLink  or  Hibernate      

En<tyManager  crea<on  and  injec<on      

Op<onal:  Execute  Database  opera<on  on  test  setup  and  teardown    

§  Import  SQL  Scripts  §  Dele<ng  test  data  aaer  the  test  execu<on  

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

•  Version  2.0   h-p://needle.spree.de/  

Need(le)  for  Speed  

public class OrderDaoTest {

@Rule public DatabaseRule dbRule = new DatabaseRule();

@Rule public NeedleRule needleRule = new NeedleRule(dbRule);

@ObjectUnderTest private OrderDao orderDao;

@Test public void testFind() { Order order = new OrderTestdataBuilder().buildAndSave(); Order orderFromDb = orderDao.find(order.getId()); assertEquals(checkout); } }

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

•  Version  2.0   h-p://needle.spree.de/  

Live  Demo  

DEMO  h-p://seam-­‐archetype.sourceforge.net/jbosscc-­‐seam-­‐archetype/1.4/javaee.html    

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

•  Version  2.0   h-p://needle.spree.de/  

Fast  Less  Glue  Code  Keep  Dependencies  Private  Flexible  &  Extensible    Developer  Happiness  ;-­‐)  

Summary  

Summary  

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

•  Version  2.0   h-p://needle.spree.de/  

Get  Started  Today!  

<dependency> <groupId>de.akquinet.jbosscc</groupId> <artifactId>jbosscc-needle</artifactId> <version>2.1</version> <scope>test</scope> </dependency>

Summary  

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

•  Version  2.0   h-p://needle.spree.de/  

http://needle.spree.de

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

[email protected]

http://blog.akquinet.de/

Links  

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

•  Version  2.0  

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

h-p://needle.spree.de/  


Top Related