
目录一 mockito的使用1.1 mockito介绍1.2 坐标的引入1.3 mockito的api说明1.4特殊情况的单测1.4.1 objectmapper类的单测1.4.2静态工具类+报异常案例1.4.3jwtutils静态工具类+报异常案例二 verify验证行为2.1 验证行为2.2 案例2.2.1 案例代码2.2.2 说明2.3 verify不能验证@Injectmocks的真实对象三 打桩3.1 打桩3.2 api说明3.3 返回值与没有返回值api说明3.4 综合案例3.5 案例抛出异常场景的单测3.5.1 有返回值方法抛出异常3.6无返回值的mock调用3.6.1 无返回值的正常调用3.6.2无返回值的异常调用3.6.3无返回值方法抛出异常33.7mock方法参数的要求*3.7.1 参数说明要求3.7.2 any()失效案例说明3.8回调打桩四 静态类的mock4.1静态类的打桩4.1.1 有返回值4.1.2 无返回值4.1.3 综合案例:方法中有工具类的静态方法五 私有方法的mock5.1 私有方法的mock案例六 常用注解6.1 @mock注解6.1.1 使用junit4 语法6.1.2使用junit5语法6.2@mockBean注解6.3@InjectMock注解七spy注解的作用7.1 spy7.2 spy与mock的区别7.3spy的案例代码一 mockito的使用1.1 mockito介绍Mockito是一个用于Java单元测试的mock框架,用于创建模拟对象(mock object)来替代真实对象,帮助开发者隔离外部依赖,从而专注于单元测试的逻辑,Mockito通常配合单元测试框架(如JUnit)使用。1.2 坐标的引入dependency groupIdorg.mockito/groupId artifactIdmockito-core/artifactId version4.11.0/version scopetest/scope/dependency注意:Spring Boot Test 默认集成了 Mockito。无需再重复引入。1.3 mockito的api说明1.创建mock对象:使用mock()创建mock对象。2.打桩:使用when()和thenReturn()等方法指定mock对象的特定方法被调用时的行为(如返回值或抛出异常)。3.验证行为:使用verify()检查mock对象的特定方法是否被调用,参数和调用次数是否符合预期。@Mock:创建一个 Mock 对象,可以用verify()@InjectMocks:创建一个真实对象,将其依赖(Mock 对象)注入进去,不能用verify()1.4特殊情况的单测1.4.1 objectmapper类的单测1.objectmapperMapString,Object resultMap = objectMapper.readValue(result,new TypeReferenceMapString,Object(){})2.对应的单测import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.any; when(objectMapper.readValue(eq(result), any(TypeReference.class))).thenReturn(resultMap);1.4.2静态工具类+报异常案例String resultStr = ""; try { resultStr = JacksonUtils.writeValueAsStringWithException(emitterResultDto); } catch (JsonProcessingException e) { log.error("解析EmitterResultDto对象为json字符串出现问题", e); } return resultStr;对应单测@Test public void testEmitterResultStrException() { try (MockedStaticJacksonUtils utils = mockStatic(JacksonUtils.class)) { utils.when(() - JacksonUtils.writeValueAsStringWithException(any())) .thenThrow(new JsonProcessingException("shibai")); String fileInfo = "bc"; chatService.getEmitterResultStr(fileInfo, token: "", stopReason: "stop"); } }1.4.3jwtutils静态工具类+报异常案例1.测试类2.对应单测private MockHttpServletRequest request; @Mock ListString strList; @InjectMocks private ChatService chatService; private static final String TEST_SECRET_KEY = "ABC34548....";//无特殊含义,随机生成的48位 @Before public void setUp() { ReflectionTestUtils.setField(chatService,"secretKey",TEST_SECRET_KEY); } @TEST public void testHandleAuthenticationToken2() throws IOException { request = new MockHttpServletRequest(); MapString,Object resultMap = new HashMapString,Object(); resultMap.put("userName","tt"); String token = JWTUtils.crateJwt(TEST_SECRET_KEY,resultMap); token = CommonConstansts.BEARER+" "+token; request.addHeader("Authorization",token); SseEmitter emitter = new SseEmitter(); Locale locale = Locale.CHINA; String result = chatService.handleAuthenticationToken(request,emitter,locale); Assert.assertNull(result); }1.4.4 @Value获取配置属性对应字段单测1.业务类2.对应单测:使用Mock + @Value 注入写法,使用ReflectionTestUtils,要配置写成appKey是java属性字段二 verify验证行为2.1 验证行为使用verify()检查mock对象的特定方法是否被调用,参数和调用次数是否符合预期。Mockito 的verify()用于验证模拟对象的方法是否按预期被调用,包括调用次数、参数匹配等。它支持精确验证(如times(2))、最少/最多次数(atLeast()/atMost())、未调用(never())及顺序验证(结合InOrder)等,确保代码执行逻辑正确。2.2 案例2.2.1 案例代码package com.ljf.services; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.util.List; import static org.mockito.Mockito.*; /** * @ClassName: MockTest * @Description: TODO * @Author: admin * @Date: 2025/08/1717:19:09 * @Version: V1.0 **/ @RunWith(MockitoJUnitRunner.class) public class MockTest { @Mock ListString strList; @Test public void test(){ strList.add("bj"); strList.add("sh"); strList.add("sz"); // 模拟调用 // 1. 验证方法被调用【恰好一次】(默认行为) verify(strList).add("bj"); strList.add("bj"); // 2. 验证方法被调用【指定次数】 verify(strList, times(2)).add("bj"); // 精确2次 // 3. 验证方法【从未调用】 verify(strList, never()).clear(); // 4. 验证【调用顺序】 InOrder inOrder = inOrder(strList); inOrder.verify(strList).add("bj"); inOrder.verify(strList).add("sh"); inOrder.verify(strList).add("sz"); verifyNoMoreInteractions(strList); } }2.2.2 说明验证单次调用:verify(strList).add("bj");→ 检查add("bj")被调用 1 次。验证精确次数:verify(strList, times(2)).add("bj");→ 检查add("bj")被调用 2 次。验证禁止调用:verify(strList, never()).clear();→ 确保clear()方法从未调用。验证调用顺序:InOrder inOrder = inOrder(strList);inOrder.verify(strList).add("bj");inOrder.verify(strList).add("sh");inOrder.verify(strList).add("sz");2.3 verify不能验证@Injectmocks的真实对象verify不能验证@Injectmocks的真实对象;如图所示:三 打桩3.1 打桩打桩:可以模拟数据库、网络请求等复杂或不可控的操作。无论调用多少次,一旦被打桩,方法将返回指定的值。模拟对象(Mock)的方法调用预设返回值或行为,使得测试代码可以隔离外部依赖,并控制方法的输出或异常3.2 api说明默认情况下,对于所有返回值的方法,mock对象将返回适当的默认值。例如,对于int或Integer返回0,对于boolean或Boolean返回false,对于集合类型返回空集合,对于其他对象类型(例如字符串)返回null。参数匹配器:使用any()、eq()等灵活匹配参数,但需注意参数一致性(不能混用具体值和匹配器)。覆盖规则:最后一次打桩