2015-12-03 14 views
21

Tôi có một hạng A được sử dụng 3 lớp differnt với autowiringLàm thế nào để sử dụng @InjectMocks cùng với chú thích @Autowired trong Junit

public class A() { 

    @Autowired 
    private B b; 

    @Autowired 
    private C c; 

    @Autowired 
    private D d; 
} 

Trong khi thử nghiệm chúng, tôi muốn chỉ có 2 của lớp (B & C) như mocks và có lớp D được Autowired như chạy bình thường, mã này không làm việc cho tôi:

@RunWith(MockitoJUnitRunner.class) 
public class aTest() { 

    @InjectMocks 
    private A a; 

    @Mock 
    private B b; 

    @Mock 
    private C c; 

    @Autowired 
    private D d; 
} 

là nó thậm chí có thể làm như vậy?

Trả lời

21

Nó phải là một cái gì đó giống như

@RunWith(SpringJUnit4ClassRunner.class) 
public class aTest() { 

    @Mock 
    private B b; 

    @Mock 
    private C c; 

    @Autowired 
    @InjectMocks 
    private A a; 

} 

Nếu bạn muốn DAutowired không cần phải làm bất cứ điều gì trong lớp Test của bạn. AutowiredA của bạn phải có bản sao chính xác của D. Ngoài ra tôi nghĩ bạn cần sử dụng SpringJUnit4ClassRunner để Autowiring hoạt động, với contextConfiguration được đặt chính xác. Bởi vì bạn đang không sử dụng MockitoJunitRunner bạn cần phải khởi tạo của bạn mocks mình sử dụng

MockitoAnnotations.initMocks (java.lang.Object TestClass)

+0

Có cách nào tôi có thể tiếp tục sử dụng @RunWith (MockitoJUnitRunner.class) và giải quyết vấn đề này không? mã trên chỉ là một phần của lớp thử nghiệm lớn hơn, và tôi không thể thay đổi cách chúng ta chạy junits – USer22999299

+1

Có thể, nhưng bạn không thể sử dụng 'Autowired' trong trường hợp đó, bạn phải tự mã hóa để khởi tạo ngữ cảnh mùa xuân. của 'A' –

+2

Có một trường hợp khi phương pháp này không hoạt động: khi' A' được chú thích bằng '@ Transactional' (hoặc có các phương thức được chú thích bằng' @ Transactional'); xem http://stackoverflow.com/questions/12857981/transactional-annotation-avoids-services-being-mocked và http://stackoverflow.com/questions/21124326/how-to-inject-mock-into-service-that - Giao dịch –

2

tôi đã phải đối mặt với cùng một vấn đề và cố gắng câu trả lời bằng cách Sajan Chandran . Nó không hoạt động trong trường hợp của tôi bởi vì tôi đang sử dụng chú thích @SpringBootTest để chỉ tải một tập con của tất cả các bean của tôi. Mục tiêu không phải là tải các hạt mà tôi đang chế nhạo vì chúng có nhiều phụ thuộc và cấu hình khác.

Và tôi đã tìm thấy biến thể sau của giải pháp để làm việc cho tôi, cũng có thể sử dụng được trong trường hợp thông thường.

@RunWith(SpringRunner.class) 
@SpringBootTest(classes={...classesRequired...}) 
public class aTest() { 

    @Mock 
    private B b; 

    @Mock 
    private C c; 

    @Autowired 
    @Spy 
    private D d; 

    @InjectMocks 
    private A a; 

    @Before 
    public void init(){ 
     MockitoAnnotations.initMocks(this); 
    } 

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