2013-11-26 12 views
5

Hãy xem xét những đặc trưng DBUnit Xuân thử nghiệm (xem https://github.com/springtestdbunit/spring-test-dbunit):Làm thế nào để có DBUnit @DatabaseSetup xảy ra trước khi mùa xuân autowiring?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
"classpath:/META-INF/spring/applicationContext-database.xml", 
"classpath:spring-*.xml" 
}) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, 
    DbUnitTestExecutionListener.class }) 
@DatabaseSetup("/dbunit/data.xml") 
public class UnitTest { 

    @Autowired 
    private UnitUnderTest uut; 

    @Test 
    public void shouldInitDB() { 
     ... 
    } 
} 

Những gì tôi đã xác minh là, và đã dự kiến, Autowiring sẽ xảy ra trước khi DatabaseSetup. Điều này phải xảy ra vì DBUnit phụ thuộc vào ngữ cảnh ứng dụng để cung cấp nguồn dữ liệu được định cấu hình.

Vấn đề là hạt UnitUnderTest có @PostConstruct nơi nó tải một số dữ liệu từ DB nhưng, do Autowiring xảy ra trước khi thiết lập DBunit, dữ liệu sẽ không có sẵn ở giai đoạn này.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này một cách rõ ràng?

+1

Cùng vấn đề này ở đây. Bất kỳ giải pháp? – Puce

+0

Nó thực sự không phải là một giải pháp tốt nhưng cho phép tôi di chuyển về phía trước.Tạo một TestClass thừa kế từ đối tượng được autowired và vạch trần một phương pháp để khởi tạo bên ngoài. Sử dụng trong bài kiểm tra @Before. –

+0

Không có giải pháp cho đến nay. Thậm chí không một cách giải quyết tốt. Sẽ tiếp tục tìm kiếm. –

Trả lời

0

Bạn có thể có phương pháp thiết lập trong lớp thử nghiệm của mình và gọi phương thức xây dựng bài đăng theo cách thủ công. Điều đó sẽ hiệu quả.

+0

Tôi e rằng đó không phải là giải pháp! Trong trường hợp như vậy, tôi sẽ phải vượt qua trách nhiệm gọi phương thức đó cho một số loại đậu khác. Tôi không nghĩ rằng có cần phải làm điều đó. Tôi đang nhảy mà thử nghiệm mùa xuân-dbunit sẽ có một cách sạch hơn, ít xâm nhập hơn để kiểm tra loại kịch bản này, mà tôi chắc chắn sẽ không phải là hiếm. –

+0

Phương pháp postconstruct của tôi cố gắng truy xuất đối tượng cơ sở dữ liệu và nó phá vỡ trong khi autowiring, do đó, giải pháp này sẽ không giúp đỡ. – TheBakker

1

Bạn có thể bạn ResourceDatabasePopulator của Spring.

Tôi nghĩ rằng bạn có thể sử dụng một cái gì đó giống như

@PostConstruct 
public void myInMemryPopulator() { 
final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); 

     try { 

      Resource[] array = resourceResolver.getResources("classpath:/*.sql");  

      for (Resource resource : array) { 

       databasePopulator.addScript(resource); 
      } 
      databasePopulator.populate(dataSource.getConnection()); 

     } catch (IOException | SQLException e) { 
      LOGGER.error("Error in databasePopulator {} ", e); 
     } 

    } 
+0

nếu vẫn không giúp được gì. Bạn có thể tạo Parent Test Case và thêm Static block trong trường hợp test cha có thể gọi phương thức này – Niraj

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