文章目录
- 1:mockito介绍
- 1.1:基本使用
- 1.2:语法
- 1:mock模拟
- 2:when-thenReturn 预定期望动作
- 3: when-thenThrow和 doThrow期望异常
- 4:when_thenAnswer 期望返回结果
- 5:.verify(检验交互)
- 6: spy真实数据
- 2:使用案例
- 2.1:引入依赖
1:mockito介绍
Mockito就是一个优秀的用于单元测试的mock框架。在软件开发中提及”mock”,通常理解为模拟对象。所以Mockito就是为了模拟对象,然后进行解耦合测试。
Mock就是做一个假的object,对这个object里的方法的调用,都会被已经Mock的假对象拦截,然后返回用户预设的行为。
1.1:基本使用
集成Mockito的基本步骤
标记被Mock(模拟)的类或者对象,生成代理对象。@Mock 标注的对象对生成一个假的对象。
通过Mockito API定制代理对象的行为
调用代理对象的方法,获得预先设计的结果
1.2:语法
1:mock模拟
实现模拟对象
方式1:使用mock
//模拟创建一个List对象
List mock = mock(List.class);
方式2:使用Mockito类
public void testMockSecond(){
List mock = Mockito.mock(List.class);
mock.add(1);
System.out.println(mock.size());
assertEquals(mock.size(),0);
}
方式3:使用@mock注解
//指定运行器
@RunWith(MockitoJUnitRunner.class)
public class MockitoTestSecond {
List one=new ArrayList(); //正常的创建对象
@Mock //注解模拟的对象
List list;
@Test
public void one() {
list.add(1);
System.out.println(list.size());
new MockitoTestSecond().one.add(1);
}
}
mock重置,会清除所有的预定动作和值
List mock = mock(List.class);
reset(mock);
2:when-thenReturn 预定期望动作
设定动作发生时期望的返回值
@Test
public void when_thenReturnTwo(){
ArrayList mock = Mockito.mock(ArrayList.class);
预定当发生mock.add(1)动作时返回true,后面动作都返回false
when(mock.add(1)).thenReturn(true).thenReturn(false);
boolean add = mock.add(1); //期望是true
boolean add1 = mock.add(2); //期望是false
System.out.println(add+"--"+add1); //结果 true--false
}
3: when-thenThrow和 doThrow期望异常
顾名思义:当发生什么动作时,抛出什么异常。
doThrow:用于无返回值的方法
thenThrow:用于有返回值的方法
@Test
public void when_thenThrow3(){
ArrayList mock = Mockito.mock(ArrayList.class);
when(mock.add(1)).thenThrow(new RuntimeException());
doThrow(new RuntimeException()).when(mock).clear();
mock.add(1);
mock.clear();
}
4:when_thenAnswer 期望返回结果
当某个动作发生时,期望给的结果是
@Test
public void when_thenAnswer(){
ArrayList mock = Mockito.mock(ArrayList.class);
when(mock.add(1)).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
return true; //期望发生mock.add(1)动作全部返回true
}
});
boolean add = mock.add(1);
assertEquals(add,true); //使用junit的断言判断
}
5:.verify(检验交互)
检验交互行为是否发生,是个Boolean类型,默认是false,只要不爆出异常就代表行为发生正常。,可以传入timeout参数进行超时验证。
@Test
public void testMockFour(){
ArrayList mock = Mockito.mock(ArrayList.class);
mock.add(1); //因为是模拟的list,所以实际的mock里没有被添加上1
//使用verify进行交互验证判断add动作是否发生
Boolean verify = verify(mock).add(2);
verify(mock,timeout(10)).add(1); //进行超时效率验证
//可知依旧是false,没有抛出异常,也就是说正常情况下add行为进行正常
System.out.println(verify);
}
6: spy真实数据
使用spy来监控真实的对象会调用API去执行。而mock是模拟的不会执行api,注意两种的区别。
需要注意的是此时我们需要谨慎的使用when-then语句,而改用do-when语句.
when-then 会执行api,而do-when不会,所以do-when不能和mock结合使用(mock本来就是不会执行api的)
/*spy执行会正式的调用api去执行,和mock模拟有所不同*/
@Test
public void testSpy(){
//使用spy模拟真实数据
ArrayList<Object> objects = new ArrayList<>();
List spy = spy(objects);
when(spy.add(1)).thenReturn(true);
//
doReturn(false).when(spy).add(2);
boolean add1 = spy.add(1);
boolean add2 = spy.add(2);
System.out.println(spy.size()+""+add1+"+"+add2); //1
List mock = mock(List.class);
when(mock.add(1)).thenReturn(true);
// doReturn(false).when(mock.add(2)); //mock对象本来就是模拟的,不能使用doreturn
//使用mock的对象
boolean add = mock.add(1);
boolean add3 = mock.add(2);
System.out.println(mock.size()+""+add+""+add3); // 0
}
结果
1true+false
0truefalse
2:使用案例
2.1:引入依赖
mockito需要和junit一起使用
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
简单验证使用
@Test
public void testMockitoFirst(){
//模拟创建一个List对象
List mock = mock(List.class);
//使用mock的对象
mock.add(1);
System.out.println(mock.size()); //0
mock.clear();
//验证add(1)和clear()行为是否发生
verify(mock).add(1);
verify(mock).clear();
}