2012-05-09 33 views
18

Nếu tôi có một lớp học với phương thức @PostConstruct, làm thế nào tôi có thể kiểm tra hàm tạo của nó và do đó phương thức @PostConstruct của nó bằng cách sử dụng JUnit và Spring? Tôi không thể đơn giản sử dụng ClassName mới (param, param) bởi vì sau đó nó không sử dụng Spring - phương thức @PostConstruct không bị sa thải.Làm thế nào để kiểm tra hàm tạo của một lớp có phương thức @PostConstruct bằng cách sử dụng Spring?

Tôi có thiếu điều gì đó hiển nhiên ở đây không?

public class Connection { 

private String x1; 
private String x2; 

public Connection(String x1, String x2) { 
this.x1 = x1; 
this.x2 = x2; 
} 

@PostConstruct 
public void init() { 
x1 = "arf arf arf" 
} 

} 


@Test 
public void test() { 
Connection c = new Connection("dog", "ruff"); 
assertEquals("arf arf arf", c.getX1(); 
} 

Tôi có thứ gì đó tương tự (mặc dù hơi phức tạp hơn) và phương pháp @PostConstruct không bị trúng.

Trả lời

11

Hãy xem Spring JUnit Runner.

Bạn cần phải đưa lớp của bạn vào lớp thử nghiệm để mùa xuân sẽ xây dựng lớp học của bạn và cũng sẽ gọi phương thức xây dựng bài đăng. Tham khảo ví dụ về phòng khám thú y.

ví dụ:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:your-test-context-xml.xml") 
public class SpringJunitTests { 

    @Autowired 
    private Connection c; 

    @Test 
    public void tests() { 
     assertEquals("arf arf arf", c.getX1(); 
    } 

    // ... 
+0

Tôi hiểu rằng, như tôi đã nói. Nhưng làm thế nào để kiểm tra nhiều hoán vị của constructor này bên trong một lớp test? Tôi không nói rõ về câu hỏi của mình? – AHungerArtist

+0

Tôi muốn năm trường hợp thử nghiệm cho hàm tạo của lớp này. Có thực sự không có cách nào tốt hơn để có một bối cảnh ứng dụng với năm đậu như vậy và tải nó lên? – AHungerArtist

+0

Trong thời gian thực nếu có 5 cách có thể để tiêm lớp của bạn thì sợ phải nói rằng bạn phải tạo 5 định nghĩa bean trong trường hợp đó. –

0

@PostConstruct phải thay đổi trạng thái của đối tượng. Vì vậy, trong trường hợp kiểm tra JUnit, sau khi lấy đậu kiểm tra trạng thái của đối tượng. Nếu nó giống với trạng thái được thiết lập bởi @PostConstruct thì thử nghiệm là thành công.

+0

Sự cố không phải là cách kiểm tra xem nó đã thay đổi hay chưa, nhưng @PostConstruct đó không bị sa thải. Tôi sẽ chỉnh sửa bài đăng của mình để làm rõ hơn. – AHungerArtist

0

Theo mặc định, mùa xuân sẽ không nhận thức được @PostConstruct và @PreDestroy chú thích. Để bật tính năng này, bạn phải đăng ký ‘CommonAnnotationBeanPostProcessor‘ hoặc chỉ định ‘‘ trong tệp cấu hình bean.

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

hoặc

<context:annotation-config />

17

Nếu container chỉ quản lý một phần của Connection là phương pháp @PostContruct của bạn, chỉ cần gọi nó bằng tay trong một phương pháp thử nghiệm:

@Test 
public void test() { 
    Connection c = new Connection("dog", "ruff"); 
    c.init(); 
    assertEquals("arf arf arf", c.getX1()); 
} 

Nếu có nhiều hơn thế, như phụ thuộc và vân vân bạn vẫn có thể tiêm chúng bằng tay hoặc - như Sridhar đã nói - sử dụng khung kiểm tra lò xo.

+0

Đó là những gì tôi đã làm. – AHungerArtist

+7

init có thể là riêng tư –

+0

@shanyangqu Sau đó, bạn có thể sử dụng ReflectionTestUtils hoặc tương đương chẳng hạn. Đó là mã kiểm tra afterall. – mrembisz

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