当前位置: 首页 > 知识库问答 >
问题:

同时使用@Spy和@Autowired

颜功
2023-03-14

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

问题是:

    < li >如果我将@Autowired与@Spy一起使用,所有三个real方法实现都将被调用。 < li >如果我只使用@Spy,对real方法的调用返回空指针,因为没有自动连线对象的初始化。

共有3个答案

邬飞捷
2023-03-14

使用@Spy@Autowired,直到您想验证该Spy与注入该Spy的不同组件之间的交互。我发现以下方法对我有用:https://dzone.com/articles/how-to-mock-spring-bean-version-2

@Configuration
public class AddressServiceTestConfiguration {
    @Bean
    @Primary
    public AddressService addressServiceSpy(AddressService addressService) {
        return Mockito.spy(addressService);
    }
}

这会将您的自动连线组件转换为间谍对象,该对象将由您的服务使用,并可在您的测试中验证。

沃博裕
2023-03-14

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

@Spy
@Autowired
private FeatureService featureService;

我想我知道你为什么会面临这个问题了。这不是关于注入,而是关于当(bloMock.doSomeStuff()). then返回(1)vsdo返回(1).当(bloMock). doSymStuff()。请参阅:http://www.stevenschwenke.de/spyingWithMockito

最重要的区别是

姜博
2023-03-14

我知道这两种选择:

  1. 使用spring boot test中的@SpyBean注释作为唯一的注释
@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);
}
 类似资料:
  • 我尝试为Spring Boot应用程序的以下服务类编写一个JUnit测试用例。 我试图用这个测试用例覆盖尽可能多的行 我认为语句“myService.myMethod(vetResp,req);”将运行真正的方法,因为myService用@Spy注释。但SonarQube扫描报告显示,该方法没有涵盖任何一行。 我是新来的。有人能告诉我我做错了什么吗?谢谢! 谢谢大家的投入。我用@InjectMoc

  • 问题内容: 在我目前正在处理的项目中,我经常看到和在字段中一起使用。我从未在任何教程或其他资源中以这种方式看到过它。我用谷歌搜索了这个特定的组合,但是除了在GitHub上的这个线程外没有找到其他东西:https : //github.com/mockito/mockito/issues/169 这让我觉得我们在以一种奇怪的方式使用它。 注意:我认为有时同时使用两个批注是有道理的,因为如果仅使用 M

  • 我担心如果在logging.properties中使用相同的文件,log4j和logging.properties可能会导致性能和正确性问题。否则,我将需要为那些不希望在我的情况下创建不同的文件。有没有干净的方法

  • 看起来在这个话题上有一些问题,但许多问题现在已经过时,或者问的是不同的问题。 例如,我想做 我不想在 我有一个方法签名,它同时接受请求参数和请求主体(它是Kotlin,但我不认为这实际上有什么不同)。 我可以很好地访问RequestParam,但是RequestBody包含的不仅仅是我在body中发送的JSON,它包含了body和请求参数的合并。在上面的示例中,它将为body绑定输出以下内容 有没

  • 我使用的是MySQL server 5.7,对于另一个项目,我需要安装MariaDB。我遵循了官方指示,玛丽亚德官方下载页面 在安装MySQL登录后,显示以下输出 欢迎使用MariaDB监视器。命令以以下字符结尾:;或\g。您的MariaDB连接id为46服务器版本:10.4.6-MariaDB-1:10.4.6 maria~仿生MariaDB。组织二进制分布 版权所有(c)2000、2018、O

  • 问题内容: 我有一个包含一些Label()小部件,一些Button()小部件,一些Text()小部件和一些Entry()小部件的程序。之前进行过两次修订,我没有标签,并且Entry()小部件较少,为了方便起见,我混合了.pack()和.grid(),这很好。我必须进行一些重构,并在此过程中添加了额外的小部件- 添加的所有新内容都使用.grid()。其他小部件没有任何变化。现在,我遇到了“无法在。中