2015-02-19 16 views
27

Có cách nào đơn giản để tôi có thể dễ dàng ghi đè lên một bean tự động trong các bài kiểm tra đơn vị cụ thể không? Chỉ có một bean duy nhất của mọi loại trong các lớp biên dịch vì vậy nó không phải là một vấn đề cho autowiring trong trường hợp này. Các lớp thử nghiệm sẽ chứa các mocks bổ sung. Khi chạy thử nghiệm đơn vị, tôi chỉ muốn chỉ định một Cấu hình bổ sung cho biết về cơ bản, trong khi chạy thử nghiệm sử dụng này, hãy sử dụng mô hình này thay cho bean chuẩn.Ghi đè một Bean tự động trong các bài kiểm tra đơn vị

Tiểu sử có vẻ hơi quá mức đối với những gì tôi yêu cầu và tôi không chắc chắn điều này có thể đạt được với chú thích Chính dưới dạng kiểm tra đơn vị khác nhau có thể có các chế độ xem khác nhau.

+1

bạn đã thử @ContexConfiguration? http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/testing.html#testcontext-ctx-management-javaconfig Bạn có muốn có các mocks khác nhau cho các lớp thử nghiệm khác nhau không hoặc mocks khác nhau cho các phương pháp thử nghiệm khác nhau trong cùng một lớp thử nghiệm? –

+0

Có, đây là những gì tôi đã hình dung, thiết lập cấu hình tiêu chuẩn của tôi cùng với cấu hình thử nghiệm với các bean để ghi đè trong cấu hình thử nghiệm. Các mocks khác nhau cho cả lớp sẽ là đủ. – samblake

Trả lời

36

Nếu bạn chỉ đơn giản là muốn cung cấp một bean khác nhau trong các thử nghiệm của bạn, tôi nghĩ rằng bạn không cần phải sử dụng lò xo hồ sơ hoặc mockito.

Chỉ cần làm như sau:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = { TestConfig.class }) 
public class MyTest 
{ 
    @Configuration 
    @Import(Application.class) // the actual configuration 
    public static class TestConfig 
    { 
     @Bean 
     public IMyService myService() 
     { 
      return new MockedMyService(); 
     } 
    } 

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

LƯU Ý: thử nghiệm với boot mùa xuân 1.3.2/mùa xuân 4.2.4

+0

Tôi nhận được "một định nghĩa cho bean ... đã tồn tại. Định nghĩa bean cấp cao nhất này được coi là ghi đè." Tôi đã phải thay đổi phương thức "myService()" thành một số tên khác, ví dụ: "myServiceMock()". Tôi cũng khuyên bạn nên sử dụng chú thích @Primary (cho IMyService) để đảm bảo rằng bean được định nghĩa trong cấu hình TestConfig sẽ ghi đè lên một từ cấu hình Ứng dụng. – Kacper86

+1

@ Kacper86 là vì bạn đang sử dụng Spring 4.1 trở xuống, lỗi đó đã được sửa trong 4.2 – Pierre

+0

Chú thích '@ Import' là gì? Điều đó chỉ cần thiết nếu bạn muốn sử dụng các bean hiện có trong cấu hình thử nghiệm của bạn? – augurar

18

Trong mùa xuân Boot 1.4 có một cách đơn giản để làm điều đó:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = { MyApplication.class }) 
public class MyTests { 
    @MockBean 
    private MyBeanClass myTestBean; 

    @Before 
    public void setup() { 
     ... 
     when(myTestBean.doSomething()).thenReturn(someResult); 
    } 

    @Test 
    public void test() { 
     // MyBeanClass bean is replaced with myTestBean in the ApplicationContext here 
    } 
} 
+0

'MyApplication' là gì? –

+0

Bạn nên thay thế bằng tên của lớp ứng dụng thư có chứa hàm main() và được chú thích bằng @SpringBootApplixation –

+0

Nếu bạn muốn thay thế bean bằng mô hình Mockito, đây là câu trả lời hay nhất. Nếu không (ví dụ: nếu bạn muốn tiêm một đối tượng tùy chỉnh), nó sẽ không giúp ích gì. – augurar

1

Tôi đã gặp sự cố tương tự và tôi đã giải quyết bằng cách kết hợp và tôi thấy điều này hữu ích và có thể sử dụng lại được. Tôi tạo ra một hồ sơ cá nhân mùa xuân cho các cuộc thử nghiệm và một lớp cấu hình đó sẽ ghi đè đậu Tôi muốn thử một cách rất đơn giản:

@Profile("test") 
@Configuration 
@Import(ApplicationConfiguration.class) 
public class ConfigurationTests { 

    @MockBean 
    private Producer kafkaProducer; 

    @MockBean 
    private SlackNotifier slackNotifier; 

} 

Bằng cách đó tôi có thể @Autowire những hạt cà phê giả và sử dụng Mockito để xác minh về họ . Ưu điểm chính là bây giờ tất cả các thử nghiệm liền mạch có được đậu giả mà không có bất kỳ thay đổi cho mỗi thử nghiệm nào. Thử nghiệm với:

khởi động mùa xuân 1.4.2

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