同时使用@Spy和@Autowired

2022-09-01 00:52:02

我有一个包含3种方法的服务类,服务类也使用一些@Autowired注释。在3种方法中,我想模拟两种方法,但对第三种方法使用真实方法。

问题是:

  1. 如果我将@Autowired与@Spy一起使用,则将调用所有三个真正的方法实现。
  2. 如果我只使用@Spy,则使用空指针返回对real method的调用,因为没有初始化Autowired对象。

答案 1

我知道这两个选项:

  1. 使用弹簧启动测试@SpyBean注释作为唯一的注释
@Autowired
@InjectMocks
private ProductController productController;

@SpyBean
private ProductService productServiceSpy;
  1. 使用Java反射来“自动连接”间谍对象,例如ReflectionTestUtils
@Autowired
private ProductController productController;

@Autowired
private ProductService productService;

@Before
public void setUp() {
    ProductService productServiceSpy = Mockito.spy(productService);
    ReflectionTestUtils.setField(productController, "productService", productServiceSpy);
}

答案 2

我自己也很惊讶,但它确实对我们有用。我们有很多地方,比如:

@Spy
@Autowired
private FeatureService featureService;

我想我知道你为什么面临这个问题。这不是关于注射,而是关于vs。请参见: http://www.stevenschwenke.de/spyingWithMockitowhen(bloMock.doSomeStuff()).thenReturn(1)doReturn(1).when(bloMock).doSomeStuff()

非常重要的区别是,第一个选项实际上会调用 doSomeStuff()- 方法,而第二个选项则不会。两者都将导致 doSomeStuff() 返回所需的 1。