我有一个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或做任何可能导致故障的事情
答案 0 :(得分:6)
我认为你混淆了属于春天的注释和那些属于Mockito的注释。
在运行您的Web应用程序时,@ Autowired将为您的班级提供特定的依赖关系。这样您就不必使用new
关键字手动创建对象。但是在运行时,只有弹簧注释才起作用。 mockito注释不适用于此用例。
当你运行测试时,情况恰恰相反。现在春天的注释不会做任何事情,这是有效的模拟注释。
@InjectMocks
会告诉mockito:“我提供@Mock
的任何内容,以及本课程所需的内容,只需将其粘贴在那里”。即使您没有将@Autowired
放在该字段上,它也会这样做。 Mockito并不关心弹簧注释。
对于你的问题:我没有看到你将@Autowired和@InjectMocks放在同一个地方的用例。在应用程序的逻辑中使用spring注释,在测试中使用mockito注释。
我知道答案很抽象,但你的问题也是如此。要获得更具体的帮助,您应该提供a minimal, complete and verifiable example。