Cuando estamos utilizando openEJB para realizar nuestros test unitarios (Junit) puede sernos de gran utilidad hacer rollback en algunos métodos, como por ejemplo, al realizar un insert , delete o update de registros y estamos trabajando con base de datos finales, lo que provocaría que no tendrían efectos los cambios que hicieramos en nuestros test.

En nuestras pruebas estamos utilizando UserTransaction para controlar los datos de la prueba.

Para realizar el rollback, anotamos como @BeforeClass y @AfterClass los método que realizarán las operaciones de inicio y final de la transación, si lo vamos a usar en muchas clases, podríamos moverlo a una clase padre y heredar de ella..
Esto funciona bien con openejb 3.0.
UserTransaction se puede recuperar con una búsqueda jndi (java:openejb/UserTransaction) siempre que la inyección con la anotación @Resource no llegará a funcionar.

public MyTest { 

 static  MyService service; 
 
 @Resources
 UserTransaction tx; 

@BeforeClass 
public static void  onBeforeClass() throws Exception{ 
   // start openejb embeded container  here 
   InitialContext ctx  = new  IntialContext(props); 
   // lookup service here 
   service = (MyService)  ctx.lookup("java:openejb/MyServiceLocal"); 
  
} 

@AfterClass 
public static void  onAfterClass() throws Exception{     
   OpenEJB.destroy(); //destruimos el EJB
} 

@Before 
public void onBefore() throws Exception{ 
  //iniciamos la transacción o bien, la anotamos con @Resources
  //utx = new org.openejb.core.CoreUserTransaction() 
  //comenzamos la transacción
  utx.begin(); 
} 

@After 
public void onAfter() throws Exception{ 
    //hacemos rollback
  utx.rollback();
  //podríamos hacer el commit si nos interesara más que el rollback
  //utx.commit();
} 

//ejemplo de test 
@Test 
public void testServiceMethod() throws  Exception{ 
  service.hacerAlgo(); 
} 

} 
Copyright © 2016 runando