2010-09-27 23 views
8

Đây là lớp học java của tôi:Làm thế nào để tiêm PersistenceContext trong thử nghiệm đơn vị?

public class Finder { 
    @PersistenceContext(unitName = "abc") 
    EntityManager em; 
    public boolean exists(int i) { 
    return (this.em.find(Employee.class, i) != null); 
    } 
} 

Đây là bài kiểm tra đơn vị:

public class FinderTest { 
    @Test public void testSimple() { 
    Finder f = new Finder(); 
    assert(f.exists(1) == true); 
    } 
} 

kiểm tra không thành công với NullPointerException từ Finder.em không được tiêm bởi bất cứ ai. Tôi nên xử lý tình huống này đúng cách như thế nào? Liệu có thực hành tốt nhất nào tồn tại?

Trả lời

7

Nếu không có vùng chứa như Spring (hoặc thứ gì đó như Unitils - dựa trên Spring), bạn sẽ phải tiêm trình quản lý tổ chức theo cách thủ công. Trong trường hợp đó, bạn có thể sử dụng một cái gì đó như thế này là lớp cơ sở:

public abstract class JpaBaseRolledBackTestCase { 
    protected static EntityManagerFactory emf; 

    protected EntityManager em; 

    @BeforeClass 
    public static void createEntityManagerFactory() { 
     emf = Persistence.createEntityManagerFactory("PetstorePu"); 
    } 

    @AfterClass 
    public static void closeEntityManagerFactory() { 
     emf.close(); 
    } 

    @Before 
    public void beginTransaction() { 
     em = emf.createEntityManager(); 
     em.getTransaction().begin(); 
    } 

    @After 
    public void rollbackTransaction() { 
     if (em.getTransaction().isActive()) { 
      em.getTransaction().rollback(); 
     } 

     if (em.isOpen()) { 
      em.close(); 
     } 
    } 
} 
3

Tùy thuộc vào nội dung bạn muốn kiểm tra. Khi bạn có logic kinh doanh phức tạp trong lớp học Finder của mình, bạn có thể muốn giả lập EntityManager - sử dụng khuôn khổ nhạo báng như EasyMock hoặc Mockito - để đơn vị kiểm tra logic đó.

Bây giờ vì đó không phải là trường hợp tôi nghi ngờ bạn muốn kiểm tra tính kiên trì của thực thể Employee (điều này thường được gọi là kiểm tra tích hợp). Điều này đòi hỏi việc sử dụng một cơ sở dữ liệu. Để thực hiện kiểm tra dễ dàng và giữ cho các thử nghiệm của bạn được di động, bạn có thể sử dụng cơ sở dữ liệu trong bộ nhớ như HSQLDB cho mục đích này. Để bắt đầu HSQLDB, tạo ra một bối cảnh kiên trì và tiêm bối cảnh này vào lớp Finder của bạn, bạn nên sử dụng một khung công tác IoC như Spring.

Có rất nhiều hướng dẫn trên Internet giải thích cách sử dụng JPA/Spring/HSQLDB. Hãy xem dự án mẫu này: Integration testing with Maven 2, Spring 2.5, JPA, Hibernate, and HSQLDB

+0

tôi phải làm tiêm này "bằng tay" trong mọi thử nghiệm đơn vị, phải không? – yegor256

+0

Không có Spring nào có thể phân tích cú pháp chú thích @PersistenceContext và chèn nó vào lớp Finder của bạn. Bạn chỉ cần tham khảo ApplicationContext từ FinderTest. –

Các vấn đề liên quan