2013-10-18 15 views
5

Tôi có một bean Spring 3.2.4 tĩnh với phương thức @PostConstruct được bảo vệ để tải dữ liệu từ một DB khi khởi tạo.Cách trì hoãn gọi @PostConstruct cho đến khi jUnit có bối cảnh thử nghiệm thiết lập

Khi tạo thử nghiệm jUnit, trong các phương pháp thử nghiệm của mình, tôi muốn thiết lập dữ liệu trong DB để kiểm tra thích hợp bean. Tuy nhiên, do bean được khởi tạo trước các phương thức thử nghiệm của tôi, tôi không biết làm thế nào để yêu cầu Spring trì hoãn việc khởi tạo bean cho đến khi phương thức hoàn tất.

Cho rằng phương pháp @PostConstruct được bảo vệ, tôi không thể gọi nó trực tiếp để khởi tạo lại bean, trừ khi tôi sử dụng sự phản chiếu.

Có cách nào khác để làm điều này hay chỉ là cách phản chiếu? Spring có bất kỳ lớp Util nào để làm cho nó dễ dàng hơn hay tôi phải sử dụng sự phản chiếu java chuẩn?

Trả lời

2

Bạn luôn có thể bắt đầu ngữ cảnh theo chương trình cho trường hợp sử dụng đó. Hãy lưu ý rằng bạn chịu trách nhiệm về vòng đời của bối cảnh trong trường hợp này. Mã giả sau đây minh họa điều này:

@Test 
public void yourTest() { 
    // setup your database 

    ConfigurableApplicationContext context = 
     new ClassPathXmlApplicationContext("/org/foo/your-context.xml"); 
    // Or new AnnotationConfigApplicationContext(YourConfig.class) 
    try { 
     YourBean bean = context.getBean("beanId"); 
     // Assertions 
    } finally { 
     context.close(); 
    } 
} 

Có thể bạn cần Spring để khởi tạo cơ sở dữ liệu của mình. Ví dụ, bạn có thể sử dụng hỗ trợ ngữ cảnh thử nghiệm Spring thông thường để khởi tạo chỉ các bean mà bạn yêu cầu cho việc thiết lập cơ sở dữ liệu và bắt đầu một ngữ cảnh khác theo chương trình để xác nhận dịch vụ của bạn. Nếu bối cảnh cần một số dịch vụ được sử dụng để khởi tạo cơ sở dữ liệu, bạn có thể bắt đầu một bối cảnh con thay vào đó, một cái gì đó giống như

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration // for instance FooTest-context.xml 
public class FooTest { 

    @Autowired 
    private ApplicationContext mainContext; 

    @Test 
    public void yourTest() { 
     // setup your database 

     ClassPathXmlApplicationContext context = 
       new ClassPathXmlApplicationContext(); 
     context.setParent(mainContext); 
     context.setConfigLocation("/org/foo/your-context.xml"); 
     context.refresh(); 
     try { 
      YourBean bean = context.getBean("beanId"); 
      // Assertions 
     } finally { 
      context.close(); 
     } 
    } 
} 

Nếu đó là trở thành một trường hợp sử dụng tái phát, bạn có thể tạo ra một phương pháp mẫu mà bắt đầu container và gọi một giao diện gọi lại. Bằng cách đó bạn có thể chia sẻ quản lý vòng đời ngữ cảnh tại một vị trí trung tâm.

+0

Cảm ơn. Tôi đã làm việc theo cách của tôi xung quanh vấn đề, nhưng giải pháp của bạn chắc chắn mang lại cho tôi một cách khác để nhìn vào nó. –

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