欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

打桩

最编程 2024-04-26 14:38:33
...

打桩方式

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框架中用于创建“任意匹配器”的工具,它们在编写单元测试时非常有用,特别是当我们要验证方法被调用时的参数类型和数量,而不关心具体的参数值时。简单举几个例子

  1. 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方法被调用时,传入了任意对象
}
  1. 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方法被调用时,传入了任意列表
}
  1. 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 对象
}
  1. 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 对象
}
  1. 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 对象
}