Mi consejo para usted sería no caer en la trampa común que veo, que es pensar que debe elegir entre burlarse y usar un contenedor EJB incrustado.
Puede usar ambos, debe usar ambos, y cuando le resulte difícil de usar, debe exigir una mejor compatibilidad y más características de su contenedor EJB.
Sin duda, encontrará personas en OpenEJB realmente de apoyo y más que feliz de agregar características para ayudar a obtener lo mejor de ambos mundos. Casi todas las características realmente buenas se han creado en torno a las solicitudes de los usuarios que intentan hacer cosas muy específicas y encontrarlas difíciles.
EJBContainer API estándar
package org.superbiz.stateless.basic;
import junit.framework.TestCase;
import javax.ejb.embeddable.EJBContainer;
public class CalculatorTest extends TestCase {
private CalculatorBean calculator;
/**
* Bootstrap the Embedded EJB Container
*
* @throws Exception
*/
protected void setUp() throws Exception {
EJBContainer ejbContainer = EJBContainer.createEJBContainer();
Object object = ejbContainer.getContext().lookup("java:global/simple-stateless/CalculatorBean");
assertTrue(object instanceof CalculatorBean);
calculator = (CalculatorBean) object;
}
fuente completo here
Este explora la ruta de clase y carga todos los granos.
n-escaneo, el enfoque más fácil de burla
enfoque ligeramente diferente donde se define todo en código. Obviamente, la burla es más fácil ya que puedes proporcionar implementaciones simuladas de frijoles donde sea necesario a voluntad.
@RunWith(ApplicationComposer.class)
public class MoviesTest extends TestCase {
@EJB
private Movies movies;
@Resource
private UserTransaction userTransaction;
@PersistenceContext
private EntityManager entityManager;
@Module
public PersistenceUnit persistence() {
PersistenceUnit unit = new PersistenceUnit("movie-unit");
unit.setJtaDataSource("movieDatabase");
unit.setNonJtaDataSource("movieDatabaseUnmanaged");
unit.getClazz().add(Movie.class.getName());
unit.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
return unit;
}
@Module
public EjbJar beans() {
EjbJar ejbJar = new EjbJar("movie-beans");
ejbJar.addEnterpriseBean(new StatefulBean(MoviesImpl.class));
return ejbJar;
}
@Configuration
public Properties config() throws Exception {
Properties p = new Properties();
p.put("movieDatabase", "new://Resource?type=DataSource");
p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
return p;
}
@Test
public void test() throws Exception {
userTransaction.begin();
try {
entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
entityManager.persist(new Movie("Joel Coen", "Fargo", 1996));
entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998));
List<Movie> list = movies.getMovies();
assertEquals("List.size()", 3, list.size());
for (Movie movie : list) {
movies.deleteMovie(movie);
}
assertEquals("Movies.getMovies()", 0, movies.getMovies().size());
} finally {
userTransaction.commit();
}
}
}
Full source here
El resultado final
Es tentador para centrarse en las diferencias entre los diferentes tipos de pruebas, etc., pero sin duda hay algo que decir acerca de un medio pragmático. Personalmente, no veo nada malo en poder mezclar los estilos de "unidad" e "integración" con la mayor fluidez posible.
Sin duda, es un objetivo admirable. Las ideas y solicitudes de características para acercarnos son bienvenidas.
Hola David, muchas gracias por su respuesta. También estaba pensando en mezclar ambos enfoques, lo que ayudaría a cosechar los beneficios de ambos enfoques. – Bala