13

When I was writing test case using the Mockito and Junit, I was using the @InjectMocks for the class to be tested. In other parts of project, I also see @Autowired is being used for the class to be tested.

When can I use @InjectMocks and @Autowired? What is the difference between two when we are trying to use them with class to be tested?

4

2 回答 2

12

@InjectMocks是一种 Mockito 机制,用于将测试类中声明的字段注入到被测中的匹配字段中。它不需要被测类是 Spring 组件。

@Autowired是 Spring 的注释,用于将 bean 自动装配到生产、非测试类中。

如果您想利用@Autowired被测类中的注释,另一种方法是使用springockito,它允许您声明模拟 bean,以便它们将自动装配到被测类中,就像 Spring 自动装配 bean 一样。但通常这不是必需的。

于 2014-09-17T14:27:05.690 回答
12

@InjectMocks注释告诉 Mockito 将所有模拟(由@Mock注释注释的对象)注入测试对象的字段。Mockito 为此使用反射。

@Autowired注释告诉 Spring 框架从其 IoC 容器中注入 bean。当它是私有字段注入时,Spring 也为此使用反射。您甚至可以使用甚至使用@Inject注解(Java EE 规范的一部分)来获得相同的效果。

但我建议看看Constructor injection 优于 Field injection的好处。在这种情况下,您根本不需要使用@InjectMocks,因为您可以通过构造函数将模拟传递给测试对象。在您的测试和生产中,引擎盖下都不需要反射。

如果您想使用 Spring bean 的子集创建集成测试,我建议您查看@DirtiesContext注释。它是通常称为“Spring Test”的 Spring 框架模块的一部分。

于 2014-09-17T15:13:03.517 回答