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

@Autowire与@InjectMocks结合使用

颜哲彦
2023-03-14

我有一个Spring boot项目,它有一套单元测试,使用mockito的@InjectMock来实例化正在测试的类,并将可能存在的任何Mock注入其中。

换句话说,如果我有这个

@InjectMocks MyClass myClass;

那我就不需要

MyClass MyClass=新的MyClass()
或@Autowired MyClass MyClass;

到目前为止,这种设置运行良好。

然而,最近在运行测试时,有必要访问项目的spring boot属性。这意味着必须在测试中使用SpringBoot任务运行器,以便@Autowire的任何实例(包括实例化环境类的实例)都能工作。

我发现,如果@InjectMocks用于实例化类,则类内的任何@Autowired实例都不起作用(它们应创建的对象为 null)。这意味着没有环境类,也无法访问 Spring 属性。

相反,我必须将@Autowired添加到@InjectMocks注释中

所以这个

@InjectMocks MyClass myClass;

变成这个

@Autowired
@InjectMocks MyClass myClass;

我的问题很简单。这样做有什么问题吗?它是双重实例化myClass还是做任何可能导致故障的事情

共有1个答案

汲丰茂
2023-03-14

我认为你混淆了属于spring的注释和属于Mockito的注释。

在运行web应用程序时,@Autowired将为您的类提供一个特定的依赖项。这样,您就不必使用<code>new<code>关键字手动创建对象。但在运行时,只有spring注释起作用。mockito注释不适用于此用例。

当您运行测试时,情况正好相反。现在Spring注释什么都不会做,而是mockito注释在工作。@InjectMocks会告诉mockito:“我用@Mock提供的任何东西,并且这个类需要的东西,只要把它放在那里”。即使您没有在该字段上放@Autow的,它也会这样做。Mockito不关心Spring注释。

对于您的问题:我没有看到您将@Autowired和@injectmock放在同一位置的用例。在应用程序的逻辑中使用spring注释,在测试中使用mockito注释。

我知道答案是相当抽象的,但你的问题也是如此。要获得一些更具体的帮助,您应该提供一个最小,完整且可验证的示例。

 类似资料:
  • 问题内容: 我在SO上发现了其他几个有关JavaMail API和通过SMTP服务器发送邮件的问题,但是没有一个使用TLS安全性进行讨论。我正在尝试使用JavaMail通过我的工作SMTP邮件服务器向我发送状态更新,但是它需要TLS,而且我在网上找不到任何有关如何使用JavaMail访问需要TLS加密的SMTP服务器的示例。有人能帮忙吗? 问题答案: 实际上,我们的产品中确实有一些通知代码,如果有

  • 问题内容: 我有一些关于永久使用Node.js的问题,可能很琐碎。根据我的阅读,永远可以通过编程使用,并且它维护了一个列表,其中包含所有永远使用的脚本。该进程终止后,它会自动产生一个新的进程,直到停止为止。 但是,我的问题是,如何永远做到这一点?是否还会添加这些脚本以在启动时启动? 问题答案: 您可以像这样永久性地使用程序: 在node.js脚本中使用Forever实例: 您应该花一点时间阅读一下

  • 我已经阅读了一些关于SaaS/PaaS/IaaS的信息,我在想: 如果我提供了一个SaaS应用程序,我的客户能否使用PaaS开发和部署他自己的应用程序,PaaS将使用一些API与我的SaaS应用程序交互?还是我对云服务的理解有误?

  • 问题内容: 我目前正在研究Mockito框架,并且已经使用Mockito创建了一些测试用例。但后来我读到的不是调用模拟( SomeClass的 的.class)我可以使用和-我需要做的唯一一件事情就是我的注释测试类或使用的方法。 但这不起作用-似乎不会起作用!这是我的2个代码修订-一个使用注释,另一个不使用注释。 我究竟做错了什么? 正如我所说-这项工作很棒。但是以下内容不会: 这是课程: 我想念

  • 问题内容: 谁能给我指出一个完整的示例,而 不是 在App Engine上使用OAuth2和Flask对Google帐户进行身份验证? 我试图让用户授予对Google日历的访问权限,然后使用该访问权限从日历中检索信息并对其进行进一步处理。我还需要存储并稍后刷新OAuth2令牌。 我看过Google的oauth2client库,可以开始检索授权代码了,但是我从那里有点迷失了。通过查看Google的O

  • 问题内容: TextMate似乎使用了我假定的内置Python版本(sys.path不起作用)。您如何配置它以使用3.1?我已经安装了3.1软件包,并且可以将IDLE用于交互式会话,但是现在需要使用TextMate。 谢谢 问题答案: TextMate使用变量的值来查找Python解释器的路径。一个好的解决方案是利用TextMate的能力来定义变量(例如基于每个项目): 打开一个新的或现有的Tex