あなたのアドバイスは、私が見ている共通のトラップに陥らないようにすることです。これは、モックと組み込みのEJBコンテナの使用を選択する必要があると考えることです。
両方を使用することができます。両方を使用する必要があります。両方を使用するのが難しい場合は、EJBコンテナのより優れたサポートとより多くの機能を要求する必要があります。
もちろん、OpenEJBの人々は本当に支持的で、両方の世界のベストを得るための機能を追加することができます。ほぼすべての本当に良い機能は、ユーザーが非常に具体的なことをしようとしていることを求めて、難しいと感じるという要求の周りに作成されています。
標準EJBContainerのAPI
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;
}
完全なソースhere
これはクラスパスをスキャンし、すべてのBeanをロードします。あなたは、コードのすべてを定義する
無スキャン、簡単にモックアプローチ
若干異なるアプローチ。明らかに、必要に応じて必要に応じて豆のモック実装を提供できるので、嘲笑はより簡単です。
@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
最終結果
それは、テストの異なるタイプの違いに焦点を当てることは魅力的だなど確かに実用的なミドルのために言うことに何かがあります。私は個人的には、「ユニット」と「統合」のスタイルをできるだけ流暢に混ぜることができないということは間違っていません。
確かに、それは素晴らしい目標です。私たちをより近づけるためのアイデアや機能要求は大歓迎です。
こんにちはデビッド、お返事をありがとうたくさん。私は両方のアプローチをミックスすることも考えていました。どちらのアプローチも、両方のアプローチの利点を収穫するのに役立ちます。 – Bala