@InjectMocks的等效方法

时间:2012-10-12 07:35:41

标签: java junit mocking mockito

以下方法的等效方法是什么:

@Mock
MyType1 myType1;

@Autowired
@InjectMocks
MyType2 myType2;

我可以用@Mock替换mock(MyType1.class)

但是如何用方法调用替换@InjectMocks?像这样:

injectMocks(MyType2.class)

2 个答案:

答案 0 :(得分:12)

Mockito中没有用于模拟注入的公共API。此外,由于此注释主要是根据测试中的布局方式进行的,因此它与测试的初始化阶段相关。

虽然它可能会在未来某个时候发生变化。

但是,Mockito注释字段可以由MockitoJUnitRunnerMockitoAnnotations.initMocks()初始化。它们都创建模拟实例并执行注入。

此外,我在您的代码中看到您正在使用@Autowired - 因此可能是通过XML配置的spring东西。 @InjectMocks并没有真正开发用于其他依赖注入框架,因为开发是由单元测试用例驱动的,而不是集成测试。

你可能想看看springockito,这是另一个试图在Spring中缓解Mockito模拟创建的项目。

希望有所帮助

答案 1 :(得分:3)

为什么在junit测试中使用Autowired?由于您正在模拟MyType2的依赖项,因此在编写测试时必须知道它的concreate实现。

然后您不需要也不应该使用Spring或任何注入框架来创建您要测试的MyType2实例。在测试初始化​​中直接创建它!我知道在使用IoC框架几年后,编写myType2 = new MyType2Impl(mock(myType1.class))很困难,但它确实会使您的测试变得更简单,更快(因为没有构建应用程序上下文)。 例如:

@Before
public void setup() {
  myType1 = mock(MyType1.class);
  myType2 = new MyType2Impl(myType1);
}

但如果您真的想在junit测试中使用IoC,请使用Brice建议的springockito,并在您的应用程序上下文中构建模拟MyType1