打桩
打桩方式
1、when().thenReturn()
2、doReturn().when()
以上两种是有返回值的方法打桩,通常使用。
3、doNothing().when()…
void方法打桩;
4、when().thenThrow()
5、doThrow().when()
以上两种是抛异常打桩;
6、when().thenAnswer()
7、doAnswer().when()
以上两种是复杂参数打桩,可以根据传参自定义返回结果。
8、@InjectMocks+@Spy,打桩被测类的某个方法
正常被单测对象使用@InjectMocks注解,被测业务逻辑复杂,比如被测方法A()→B()→C()。如果当前单元测试用例不打算测试到C()方法,就需要结合@Spy和具体打桩方式跳过C()方法。
打桩参数匹配方式
打桩时,如果被测方法有输入参数,有以下方式传参:
any()、anyList()、anyByte()、anyBoolean()、anyChar()、anyCollection()、anyDouble()、anyFloat()、anyInt()、anyIterable()、anyLong()、anyMap()、anySet()、anyShort()、anyString()
通常仅需要any(),如果被打桩的测试方法有重载,则需要指定具体的参数类型。
这些传参方法是Mockito框架中用于创建“任意匹配器”的工具,它们在编写单元测试时非常有用,特别是当我们要验证方法被调用时的参数类型和数量,而不关心具体的参数值时。简单举几个例子
- any():
用途:匹配任何类型的对象。当被测方法接受的对象类型不确定或不关心其具体值时使用。
import static org.mockito.Mockito.*;
class Service {
void process(Object input) {
// ...
}
}
@Test
void testProcessMethod() {
Service service = mock(Service.class);
service.process(any()); // 匹配任何类型的对象作为输入参数
verify(service).process(any()); // 验证process方法被调用时,传入了任意对象
}
- anyList():
用途:匹配任何类型的列表(实现 List 接口的对象)。当被测方法接受一个列表作为参数,但不关心列表的具体元素时使用。
import static org.mockito.Mockito.*;
class Service {
void handleList(List<String> items) {
// ...
}
}
@Test
void testHandleListMethod() {
Service service = mock(Service.class);
service.handleList(anyList()); // 匹配任何类型的列表作为输入参数
verify(service).handleList(anyList()); // 验证handleList方法被调用时,传入了任意列表
}
- anyCollection():
用途:匹配任何类型的 Collection 对象(实现了 Collection 接口的对象)。当被测方法接受一个集合作为参数,但不关心集合的具体元素时使用。
import static org.mockito.Mockito.*;
class Service {
void handleCollection(Collection<String> items) {
// ...
}
}
@Test
void testHandleCollectionMethod() {
Service service = mock(Service.class);
service.handleCollection(anyCollection()); // 匹配任何类型的 Collection 对象作为输入参数
verify(service).handleCollection(anyCollection()); // 验证handleCollection方法被调用时,传入了任意 Collection 对象
}
- anyIterable():
用途:匹配任何实现了 Iterable 接口的对象。当被测方法接受一个可迭代对象作为参数,但不关心其具体元素时使用。
import static org.mockito.Mockito.*;
class Service {
void processIterable(Iterable<String> items) {
// ...
}
}
@Test
void testProcessIterableMethod() {
Service service = mock(Service.class);
service.processIterable(anyIterable()); // 匹配任何 Iterable 对象作为输入参数
verify(service).processIterable(anyIterable()); // 验证processIterable方法被调用时,传入了任意 Iterable 对象
}
- anyMap():
用途:匹配任何类型的 Map 对象(实现了 Map 接口的对象)。当被测方法接受一个映射作为参数,但不关心其具体键值对时使用。
import static org.mockito.Mockito.*;
class Service {
void updateData(Map<String, Integer> data) {
// ...
}
}
@Test
void testUpdateDataMethod() {
Service service = mock(Service.class);
service.updateData(anyMap()); // 匹配任何 Map 对象作为输入参数
verify(service).updateData(anyMap()); // 验证updateData方法被调用时,传入了任意 Map 对象
}
上一篇: Java 框架】SpringMVC(一)--基本环境和基本结构体系
下一篇: 合并多个数组的四种方法