Tôi gặp vấn đề về vòng đời khi thực hiện một số bộ thử nghiệm với JUnit.JUnit vòng đời
Để viết có ích đơn vị JPA 2,0 kiểm tra Là một nhà phát triển Java Tôi muốn:
- Khởi tạo một thể hiện EntityManagerFactory một lần trước khi tất cả các dãy phòng xét nghiệm. Tôi đạt được đối tượng bằng cách sử dụng chú giải @BeforeClass
- Khởi tạo phiên bản EntityManager và bắt đầu giao dịch mới trước mỗi trường hợp thử nghiệm và quay lại giao dịch đã bắt đầu như AOP trước/sau hoặc xung quanh lời khuyên
- Có thể thực hiện bất kỳ thiết lập nào/xé xuống các hoạt động trước/sau trong bất kỳ bộ thử nghiệm có nguồn gốc nào
Tôi đã viết rất nhiều bài kiểm tra JUnit. Nhưng trong trường hợp như vậy, tôi đã có vấn đề với các mục thứ hai và thứ ba từ danh sách.
Hãy xem những ví dụ kiểm tra bộ sau:
Một trừu tượng thử nghiệm bộ:
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();
}
}
Một bộ kiểm tra nguồn gốc:
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());
}
}
Do không xác định thứ tự của các chú thích vòng đời JUnit, NullPointerException diễn ra trong phương thức e setUp() trong lớp dẫn xuất. Rõ ràng với tôi.
Có thể lấy mục tiêu mà không cần tiêm mã giao dịch bắt đầu/rollback trong mỗi phương thức setUp()/tearDown() của bất kỳ lớp bộ thử nghiệm có nguồn gốc nào không? Hoặc, có thể, liệu có một khuôn khổ JUnit hoặc khung kiểm tra thay thế có thể cung cấp một cách dễ dàng để thể hiện nhu cầu của tôi không?
Xin cảm ơn trước.
Vâng, đó là một ý tưởng hay. Vì Google Guice là một IoC gọn gàng, nó có thể được sử dụng mà không có tác động của mã. –