@Autowire与@InjectMocks结合使用

meg*_*man 4 mockito autowired instances spring-boot

我有一个Spring启动项目,它有一套单元测试,使用mockito的@InjectMocks来实例化被测试的类并注入可能存在的任何模拟.

换句话说,如果我有这个

@InjectMocks MyClass myClass;

然后我不需要

MyClass myClass = New MyClass();
或@Autowired MyClass myClass;

到目前为止,此设置工作正常.

但是最近,在运行测试时,必须能够访问项目的spring引导属性.这意味着必须在测试中使用SpringBoot任务运行器,以便@Autowire的任何实例(包括实例化Environment类的实例)都可以工作.

我发现如果@InjectMocks用于实例化一个类,那么类中@Autowired的任何实例都不起作用(它们应该创建的对象为null).这意味着没有Environment类,也无法访问Spring属性.

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

所以这

@InjectMocks MyClass myClass;

变成了这个

@Autowired
@InjectMocks MyClass myClass;

我的问题很简单.这样做有什么不对吗?它是否会实例化myClass或做任何可能导致故障的事情

小智 6

我认为你混淆了属于春天的注释和那些属于Mockito的注释.

在运行您的Web应用程序时,@ Autowired将为您的班级提供特定的依赖关系.这样您就不必使用new关键字手动创建对象.但是在运行时,只有弹簧注释才起作用.mockito注释不适用于此用例.

当你运行测试时,情况正好相反.现在春天的注释不会做任何事情,这是有效的模拟注释. @InjectMocks将告诉mockito:"我提供的任何东西,@Mock这个课程所需的东西,只需坚持在那里".即使你没有穿上@Autowired那个领域也会这样做.Mockito并不关心春天的注释.

对于你的问题:我没有看到你将@Autowired和@InjectMocks放在同一个地方的用例.在应用程序的逻辑中使用spring注释并在测试中使用mockito注释.

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