以下内容的等效方法是什么:
@Mock
MyType1 myType1;
@Autowired
@InjectMocks
MyType2 myType2;
我可以@Mock
用mock(MyType1.class)
.
但是我怎样才能@InjectMocks
用方法调用代替呢?像这样的东西:
injectMocks(MyType2.class)
Mockito 中没有用于模拟注入的公共 API。另外,由于此注释主要是根据测试中的布局方式驱动的,因此它与测试的初始化阶段相当相关。
尽管它可能会在未来的某个时候发生变化。
但是,Mockito 注释字段可以由MockitoJUnitRunner
或初始化MockitoAnnotations.initMocks()
。它们都创建模拟实例并执行注入。
我还在您的代码中看到您正在使用的代码@Autowired
- 因此可能是通过 XML 配置的 spring 的东西。@InjectMocks
并不是真正为与其他依赖注入框架一起工作而开发的,因为开发是由单元测试用例驱动的,而不是集成测试。
您可能想看看springockito,这是另一个试图在 Spring 中简化 Mockito 模拟创建的项目。
希望有帮助
为什么Autowired
在你的junit测试中使用?由于您正在模拟依赖项,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
在您的应用程序上下文中构建您的模拟。