一起使用@Spy 和@Autowired

新手上路,请多包涵

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

问题是:

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

原文由 Shashi K Kalia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

我知道这两个选项:

  1. 使用来自 spring-boot-test 的 @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);
}

原文由 PROrock 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 @Spy
@Autowired
private FeatureService featureService;

我想我知道你为什么会面临这个问题。这与注入无关,而是关于 when(bloMock.doSomeStuff()).thenReturn(1) vs doReturn(1).when(bloMock).doSomeStuff() 。请参阅:http: //www.stevenschwenke.de/spyingWithMockito

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

原文由 yuranos 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题