@Autowire结合@InjectMocks

时间:2017-02-08 09:11:48

标签: spring-boot mockito autowired instances

我有一个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或做任何可能导致故障的事情

1 个答案:

答案 0 :(得分:6)

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

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

当你运行测试时,情况恰恰相反。现在春天的注释不会做任何事情,这是有效的模拟注释。 @InjectMocks会告诉mockito:“我提供@Mock的任何内容,以及本课程所需的内容,只需将其粘贴在那里”。即使您没有将@Autowired放在该字段上,它也会这样做。 Mockito并不关心弹簧注释。

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

我知道答案很抽象,但你的问题也是如此。要获得更具体的帮助,您应该提供a minimal, complete and verifiable example