Mockito 测试框架
官方网站
什么是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 打桩
迭代打桩
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!