gpt4 book ai didi

java - 手动实例化@InjectMock 注解字段

转载 作者:搜寻专家 更新时间:2023-11-01 02:05:57 25 4
gpt4 key购买 nike

为了了解 Mockito 注释工作原理的基础知识,我浏览了一些博客。

但是我对何时手动实例化用 @InjectMocks 注释的字段存在疑问,即

@InjectMocks
A a = new A();

什么时候依赖 MockitoAnnotations.initMocks() 功能来做同样的事情:

@InjectMocks
A a;

这取决于我们用来运行测试用例的 JunitTestRunner 还是取决于 Mockito 框架版本?

最佳答案

这取决于您是否使用(声明)运行者。

如果您使用运行器,则无需自己调用 MockitoAnnotations.initMocks() - 运行器会为您调用它。

通常我们会选择运行者。但是,如果您想使用其他运行器(例如 Spring 的运行器),您可以自己调用 .initMocks()

需要说明的是,MockitoAnnotations.initMocks(this) 将:

  • 实例化用@InjectMocks注解的字段
  • 为每个用 @Mock 注释的字段创建一个模拟版本
  • @InjectMocks 变量的字段中注入(inject) @Mock(或调用其构造函数或使用其 setter - 这取决于您使用的依赖注入(inject)类型)

Mockito runner、initMocks 和规则代码示例

下面的三个代码示例应该是等效的。

与运行者:

第一个代码片段使用了运行器,因此无需调用 initMocks()

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

@Mock private MyDependency myDependency;
@InjectMocks private MyClass myClass;

@Test
public void myClass_should_get_stuff_from_dependency() {
when(myDependency.getStuff()).thenReturn("stuff!");

assertThat(myClass.getDependencyStuff(), is("stuff!"));
}
}

没有 runner + 手动调用 .initMocks():

这另一个不使用运行器,因此需要 setUp() 方法调用我们的 initMocks() friend 。

// notice there is no runner
public class MyClassTest {

@Mock private MyDependency myDependency;
@InjectMocks private MyClass myClass;

// but now you have to call initMocks() yourself
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}

@Test
public void myClass_should_get_stuff_from_dependency() {
when(myDependency.getStuff()).thenReturn("stuff!");

assertThat(myClass.getDependencyStuff(), is("stuff!"));
}
}

没有运行器或手动调用,使用@Rule:

最后,正如 comments (thanks @StefanBirkner) 中指出的那样, 从版本 1.10.17 开始,也可以使用 JUnit @Rule称为 MockitoRule :

public class MyClassTest {

@Rule
public MockitoRule rule = MockitoJUnit.rule();

@Mock private MyDependency myDependency;
@InjectMocks private MyClass myClass;

@Test
public void myClass_should_get_stuff_from_dependency() {
when(myDependency.getStuff()).thenReturn("stuff!");

assertThat(myClass.getDependencyStuff(), is("stuff!"));
}
}

关于java - 手动实例化@InjectMock 注解字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33397643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com