2012-04-20 32 views
11

Tôi có định nghĩa bean Spring XML mà tôi muốn viết các bài kiểm tra tích hợp cho. Định nghĩa bean XML là một phần của ngữ cảnh ứng dụng lớn hơn, trong đó một số tệp như vậy được bao gồm bằng cách sử dụng <import>. Bên trong định nghĩa, tôi tham khảo một số hạt cà phê đến từ các tệp khác.Tự động hóa mô phỏng tự động trong thử nghiệm Spring JUnit

Để thử nghiệm tích hợp, tôi muốn khởi tạo định nghĩa độc lập và sử dụng mockito mocks cho tất cả các bean khác. Cho đến bây giờ, tôi đang sử dụng một cái gì đó như thế này:

FooIntegrationTest.java

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class FooIntegrationTest { 
    @Autowired private ClassUnderTest underTest; 
    @Autowired private MockedClass mock; 

    @Test 
    public void testFoo() { 
    } 
} 

FooIntegrationTest-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <import resource="part-to-test.xml" /> 

    <bean id="mockedClassReferencedByName" class="org.mockito.Mockito" factory-method="mock" c:classToMock="SomeMockedClass" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="OtherMockedClassReferencedByType" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="MockedClass" /> 
    ... 
</beans> 

Tôi muốn để tự động hóa phần mỉa mai thay vì tẻ nhạt : Lý tưởng nhất, tôi muốn có tất cả các bean không được tìm thấy trong bối cảnh ứng dụng được tự động giả lập. part-to-test.xml sử dụng @Autowired cũng như các hạt được đặt bằng cách sử dụng các tham chiếu tên. Tôi chỉ sử dụng các tệp định nghĩa bean XML và không sử dụng các lớp @Configuration cũng như các chú thích @Component.

Tôi đã xem xét cách sử dụng trình tải ngữ cảnh tùy chỉnh trong @ContextConfiguration(loader=...), nhưng tôi chưa tìm thấy điểm mở rộng thích hợp để làm như vậy. Sprinockito dường như không thích ứng với vấn đề này.

Có một số dự án khác ngoài kia đã giải quyết được sự cố này không? Nếu không, tôi sẽ mở rộng Spring để tự động tạo các mocks ở đâu?

+0

Bạn đã thử chú thích Mockito @InjectMocks chưa? Bằng cách nào nó không đáp ứng được yêu cầu của bạn? –

+0

@DavidWallace '@ InjectMocks' hoạt động rất tốt cho các bài kiểm tra đơn vị, tức là thử nghiệm một lớp cụ thể trong đó bài kiểm tra đang sử dụng các đối tượng giả. Tuy nhiên, tôi muốn giả lập tất cả các đối tượng được tham chiếu trong định nghĩa bean Spring. Điều này có nghĩa là tôi cần phải điền vào bối cảnh ứng dụng Spring với các trình giả lập (có tên), tôi không biết cách '@ InjectMocks' giúp làm việc này như thế nào. –

+0

OK, tôi sẽ suy nghĩ về điều này một số chi tiết. –

Trả lời

3

Đây là short article with a code example. Triển khai thực hiện BeanDefinitionRegistryPostProcessor tạo đối tượng giả cho mỗi định nghĩa thiếu bean. Phần thế hệ được thực hiện với một số MocksFactory, đây là an example for such a factory.

+0

Câu trả lời này là điểm bắt đầu phù hợp để giải quyết vấn đề: Sử dụng 'BeanDefinitionRegistryPostProcessor' làm cho nó có thể quan sát các định nghĩa bean cho các hạt bị thiếu. Tôi đã mở rộng ví dụ mã để cũng chăm sóc các hạt được tiêm bằng các bộ định vị, nhưng phần mở rộng như vậy là khá nhỏ. –

+0

Liên kết thứ hai đã chết. YÊN NGHỈ. bài viết cũ –

2

Chỉ trong trường hợp bất cứ ai vẫn còn quan tâm đến câu hỏi này, tôi đã mở rộng thêm các mã trong bài viết đề cập bởi Yves Martin với thừa kế, hỗ trợ cho @Inject, vv ... và tạo ra một dự án Github đây: https://github.com/rinoto/spring-auto-mock

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