JUnitでいくつかのテストスイートを実行するにはライフサイクルの問題があります。JUnitライフサイクル
- は、すべてのテストスイートの前に一度のEntityManagerFactoryインスタンスを初期化します。便利なJPA 2.0ユニットを書き込むためには
は、私がしたいJava開発者 として をテストします。 @BeforeClass注釈を使用してオブジェクトを実現する
- EntityManagerインスタンスをインスタンス化し、各テストケースの前に新しいトランザクションを開始し、AOP前後の開始トランザクションをロールバックする前後のアドバイス
- セットアップ/派生したテストスイートの前/後の操作を破る
私はJUnitテストをたくさん書いています。しかし、このような場合、リストの2番目と3番目の項目に問題があります。
次のテストスイートの例を見てみてください。
抽象テストスイート:
public abstract class AbstractPersistenceTest {
protected static EntityManagerFactory emf;
protected EntityManager em;
@BeforeClass
public static void setUpClass() {
emf = Persistence.createEntityManagerFactory("test");
}
@Before
public void setUp() {
em = emf.createEntityManager();
em.getTransaction().begin();
}
@After
public void tearDown() {
em.getTransaction().rollback();
em.close();
}
@AfterClass
public static void tearDownClass() {
emf.close();
}
}
派生テストスイート:
public class EmployeeJpqlTest extends AbstractPersistenceTest {
private Employee john;
private Employee jack;
@Before
public void setUp() {
john = new Employee("John Doe", 1000);
jack = new Employee("Jack Line", 1010);
em.persist(john);
em.persist(jack);
}
@Test
public void itShouldRetrieveAllEmplloyees() {
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e",
Employee.class);
List<Employee> employees = query.getResultList();
assertArrayEquals(new Employee[] { john, jack }, employees.toArray());
}
@Test
public void itShoulRetrieveAllEmployeeNames() {
TypedQuery<String> query = em.createQuery(
"SELECT e.name FROM Employee e", String.class);
List<String> names = query.getResultList();
assertArrayEquals(new String[] { john.getName(), jack.getName() },
names.toArray());
}
}
ため、不特定のJUnitライフサイクルアノテーションの順序NullPointerExceptionがth e派生クラスのsetUp()メソッドそれは私にとっては明らかです。
任意の派生テストスイートクラスの各setUp()/ tearDown()メソッドに開始/ロールバックトランザクションコードを手作業で注入することなく目標を達成できますか? または、私のニーズを簡単に表現できる代替JUnitの平均またはテストフレームワークがありますか?
ありがとうございます。
はい、いい考えです。 Google Guiceは無駄なIoCであるため、コードの影響を受けずに使用できます。 –