以下方法的等效方法是什么:
@Mock
MyType1 myType1;
@Autowired
@InjectMocks
MyType2 myType2;
我可以用@Mock
替换mock(MyType1.class)
。
但是如何用方法调用替换@InjectMocks
?像这样:
injectMocks(MyType2.class)
答案 0 :(得分:12)
Mockito中没有用于模拟注入的公共API。此外,由于此注释主要是根据测试中的布局方式进行的,因此它与测试的初始化阶段相关。
虽然它可能会在未来某个时候发生变化。
但是,Mockito注释字段可以由MockitoJUnitRunner
或MockitoAnnotations.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
。