簡體   English   中英

JUnit生命周期

[英]JUnit life-cycle

我有一個生命周期問題,用JUnit做一些測試套件。

為了編寫方便的JPA 2.0單元測試作為Java開發人員,我想:

  • 在所有測試套件之前初始化一次EntityManagerFactory實例。 我通過使用@BeforeClass注釋來實現該對象
  • 實例化一個EntityManager實例並在每個測試用例之前啟動一個新事務,並在建議之前/之后或周圍回滾像AOP這樣的已啟動事務
  • 能夠在任何派生測試套件之前/之后進行任何設置/拆卸操作

我一直在寫JUnit測試。 但在這種情況下,我對列表中的第二個和第三個項目有疑問。

請查看以下測試套件示例:

抽象測試套件

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在派生類的setUp()方法中占有一席之地。 這對我來說很清楚。

是否有可能在沒有手動注入任何派生測試套件類的每個setUp()/ tearDown()方法中的啟動/回滾事務代碼的情況下獲得目標? 或者,是否有一個替代JUnit意味着或測試框架可以提供一種簡單的方式來表達我的需求?

提前致謝。

您如何使用Google Guice將實體管理器和事務注入您的測試方法?

import com.google.inject.persist.Transactional;
import javax.persistence.EntityManager; 

public class MyTest {
        @Inject EntityManager em; 

        @Test
        @Transactional 
        public void createNewPerson() {
                em.persist(new Person(...)); 
        } 
}

它可以簡化這方面的大量工作。

你為什么不在setUpsuper.setUpClass等中調用super.setUp() 你實際做的是覆蓋子類的方法。

考慮使用Spring來處理非靜態實體管理器和事務回滾的一次性實例化。 即使您沒有在應用程序中使用Spring,也可以在測試中使用它。 有關詳細信息,請參閱http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/testing.html的第9.3節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM