Mockito
注:以下测试案例已进行静态导入
import static org.mockito.Mockito.*;
verify
- verify可以验证被mock的对象释放进行了相应的操作
- 如果未进行相应的操作就会抛出异常
@Test
void verifyTest() {
//被验证的对象需要被mock
List list = mock(List.class);
list.add("abc");
list.clear();
//校验是否进行指定操作
verify(list).add("abc");
//如果没有则抛出异常
//verify(list).add("def");
verify(list).clear();
}
调用次数校验
@Test
void verifyTest(){
list.add("aaa");
list.add("bbb");
list.add("bbb");
list.add("ccc");
list.add("ccc");
list.add("ccc");
//是否调用过
verify(list).add("aaa");
//是否调用过2次
verify(list,times(2)).add("bbb");
//是否调用过3次
verify(list,times(3)).add("ccc");
//是否没有调用过
verify(list,never()).add("ddd");
//是否至少被调用过一次
verify(list,atLeastOnce()).add("aaa");
//是否至少调用过2次
verify(list,atLeast(2)).add("bbb");
//是否最多调用过3次
verify(list,atMost(3)).add("ccc");
}
- times:验证方法是否调用指定次数
- never:验证方法没有被调用过
- atLeastOnce:验证方法至少被调用过一次
- atLeast:验证方法至少执行过指定次数
- atMost:验证方法最多执行过指定次数
thenReturn
@Test
void returnTest(){
when(list.get(anyInt()))
.thenReturn("aaa")
.thenReturn("bbb");
//效果与上面相同
//when(list.get(anyInt())).thenReturn("aaa","bbb");
System.out.println(list.get(1///aaa
System.out.println(list.get(2));//bbb
System.out.println(list.get(3));//bbb
System.out.println(list.get(4));//bbb
}
- 为指定操作设置多个结果
- 当返回值进行到最后一个时,无论再调用多少次都只会返回最后一个结果
when
- when可以对被mock的对象的相应操作配置相应的结果
- 调用时如果设置结果则返回设置的结果,如果没有则返回默认值
@Test
void whenTest(){
List list = mock(List.class);
//设置对应操作的结果
when(list.get(0)).thenReturn("abc");
when(list.get(1)).thenThrow(new RuntimeException("发生异常"));
//返回abc
System.out.println(list.get(0));
//发生异常
System.out.println(list.get(1));
//返回null 不会报错
System.out.println(list.get(999));
}
-
when无法作用域无返回值的方法
-
此时可以通过do...()的方法,进行辅助
@Test
void doTest(){
//设置list的key必须是int类型,value必须是string类型
doNothing().when(list).add(anyInt(),any());
//当调用list的clear方法时抛出异常
doThrow(new RuntimeException("发生异常")).when(list).clear();
list.add(1,"abc");
list.clear();
}
@Mock
- 可以使用@Mock注解mock指定的对象
- 注意:在测试类中需要进行初始化
@Mock
private List list;
@BeforeEach
void before(){
MockitoAnnotations.initMocks(this);
}
@spy
- 和mock类似,但对于未指定mock的方法,spy默认会调用真实方法,有返回值的返回真实返回值,mock默认不执行,有返回值的返回null
@Spy
private List list;
@BeforeEach
void before(){
MockitoAnnotations.initMocks(this);
}
any
- 可以使用any()匹配所有参数
- 也可以使用如anyInt()、anyString()等方法匹配指定类型参数
@Test
void anyTest(){
//匹配所有int类型
when(list.get(anyInt())).thenReturn("abc");
//get任何数值都会返回abc
System.out.println(list.get(0));
System.out.println(list.get(1));
}