Mockito 测试框架

官方网站

https://site.mockito.org/

什么是Mock 测试

Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的对象(如 JDBC 中的ResultSet 对象,JPA的CRUDRepository,需要执行数据库操作的),用一个虚拟的对象(Mock 对象)来创建(覆盖方法返回)以便测试的测试方法。
JUnit 是一个单元测试框架。
Mockito 是用于数据模拟对象的框架。

@InjectMocks、@Spy、@Mock之间的区别

@InjectMocks:创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
@Mock:对函数的调用均执行mock(即虚假函数),不执行真正部分。
@Spy:对函数的调用均执行真正部分。

mockito之@Mock和@InjectMock

@Mock创建的是全部mock的对象,既在对具体的方法打桩之前,mock对象的所有属性和方法全被置空(0或者null);与之对应的是@Spy这个注解,@Spy可以创建部分mock的对象,部分mock对象的所有成员方法都会按照原方法的逻辑执行,直到被打桩返回某个具体的值。@Mock和@Spy才是两个具有可比性的概念。
Mokcito的mock()方法功能与@Mock相同,只是使用方式和场景不同。同样的,@Spy也对应一个spy()方法。
@Mock和@Spy注解的对象,均可被@InjectMock注入到待处理的对象中。

@Mock与@InjectMocks的区别

@Mock: 创建一个Mock.
@InjectMocks: 创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
注意:必须使用@RunWith(MockitoJUnitRunner.class) 或 Mockito.initMocks(this)进行mocks的初始化和注入。

初始化

@BeforeMethod
public void init() {
    //初始化
    MockitoAnnotations.initMocks(this);
    //复杂对象,通过反射设置
    ReflectionTestUtils.setField(orderFactory, "valueBuilder", valueBuilder);
}

使用Mocktio注入对象的时候,存在需要注入依赖对象的情况,此时可以使用@InjectMocks或者使用spring提供的ReflectionUtils进行处理

@InjectMocks
private OrderHandler orderHandler;
@Mock
private OrderFactory orderFactory;
@Mock
private ValueObjectBuilder valueObjectBuilder;

@BeforeMethod
public void init() {
    MockitoAnnotations.initMocks(this);
    ReflectionTestUtils.setField(orderFactory, "valueObjectBuilder", valueObjectBuilder);
}
//上面的情况是OrderFactory内部依赖ValueObjectBuilder,OrderHandler内部依赖OrderFactory,需要先将ValueObjectBuilder、OrderFactory Mock出来,然后在初始化方法中
//通过反射将valueObjectBuilder设置给orderFactory,然后orderHandler因为使用InjectMocks注解,会将依赖的属性orderFactory自动注入

JUnit+Mockito单元测试之打桩

when().thenReturn();
Stub 打桩
迭代打桩

posted @ 2022-07-17 22:03  crazy-zz5536  阅读(204)  评论(0编辑  收藏  举报