同时使用@Spy和@Autowired
我有一个包含3种方法的服务类,服务类也使用一些@Autowired注释。在3种方法中,我想模拟两种方法,但对第三种方法使用真实方法。
问题是:
- 如果我将@Autowired与@Spy一起使用,则将调用所有三个真正的方法实现。
- 如果我只使用@Spy,则使用空指针返回对real method的调用,因为没有初始化Autowired对象。
我有一个包含3种方法的服务类,服务类也使用一些@Autowired注释。在3种方法中,我想模拟两种方法,但对第三种方法使用真实方法。
问题是:
我知道这两个选项:
@Autowired
@InjectMocks
private ProductController productController;
@SpyBean
private ProductService productServiceSpy;
@Autowired
private ProductController productController;
@Autowired
private ProductService productService;
@Before
public void setUp() {
ProductService productServiceSpy = Mockito.spy(productService);
ReflectionTestUtils.setField(productController, "productService", productServiceSpy);
}
我自己也很惊讶,但它确实对我们有用。我们有很多地方,比如:
@Spy
@Autowired
private FeatureService featureService;
我想我知道你为什么面临这个问题。这不是关于注射,而是关于vs。请参见: http://www.stevenschwenke.de/spyingWithMockitowhen(bloMock.doSomeStuff()).thenReturn(1)
doReturn(1).when(bloMock).doSomeStuff()
非常重要的区别是,第一个选项实际上会调用 doSomeStuff()- 方法,而第二个选项则不会。两者都将导致 doSomeStuff() 返回所需的 1。