@InjectMocks等效方法

2022-09-01 11:03:27

什么是以下等效方法:

@Mock
MyType1 myType1;

@Autowired
@InjectMocks
MyType2 myType2;

我可以用.@Mockmock(MyType1.class)

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

injectMocks(MyType2.class)

答案 1

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

尽管它可能会在将来的某个时候发生变化。

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

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

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

希望有所帮助


答案 2

为什么要在你的 junit 测试中使用?由于您正在模拟依赖项,因此在编写测试时必须知道其创建实现。AutowiredMyType2

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

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

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


推荐