SpringBoot Mockito单元测试配置when..thenReturn仍抛出异常问题求助
问题根因
- mock对象未注入到被测试实例:
ConvertService的构造函数中硬编码调用ConvertFactory.of("dev", "F")生成convertUtility实例,测试类中声明的mockConvertUtility完全没有被用到,你配置的mock返回规则自然不会生效,运行时调用的是真实对象的transform方法。 - Mock配置存在语法错误:
when(convertUtility.transform(any(String.class)).thenReturn(context);缺少右括号,正确写法应为when(convertUtility.transform(any(String.class))).thenReturn(context); - 测试注解混用冲突:
@SpringBootTest是Spring Boot集成测试注解,和纯单元测试用的@RunWith(MockitoJUnitRunner.class)混用会导致Mock注解失效。 - 第三方类限制:如果
ConvertUtility是final类或者transform是final方法,Mockito默认无法对这类方法做mock,会直接执行真实逻辑。
修复方案
- 重构
ConvertService,将ConvertUtility改为构造函数注入,消除硬编码依赖:
@Service public class ConvertService { private final NetworkClient networkClient; private final ConvertUtility convertUtility; // 把ConvertUtility作为构造参数传入,由Spring容器注入 public ConvertService(NetworkClient networkClient, ConvertUtility convertUtility) { this.convertUtility = convertUtility; this.networkClient = networkClient; } public Response convert(Request request) { User user = networkClient.getData(request.getId()); Context context = convertUtility.transform(request.getToken()); // 其余业务逻辑 } }
添加Spring配置类,注册ConvertUtility为全局Bean:
@Configuration public class ConvertConfig { @Bean public ConvertUtility convertUtility() { return ConvertFactory.of("dev", "F"); } }
- 修正测试类逻辑,清理无效注解,将mock对象传入被测试实例:
// 纯单元测试不需要@SpringBootTest注解 @RunWith(MockitoJUnitRunner.class) class ConvertServiceTest { @Mock private NetworkClient networkClient; @Mock ConvertUtility convertUtility; private ConvertService convertService; @BeforeEach void setUp() { // 把两个mock对象都传入构造函数 convertService = new ConvertService(networkClient, convertUtility); } @Test void testConvertSuccess() { Request request = new Request(1000); User user = new User("user1"); Context context = new Context(); when(networkClient.getData(anyLong())).thenReturn(user); // 修正语法错误,补全括号 when(convertUtility.transform(any(String.class))).thenReturn(context); Response response = convertService.convert(request); // 此处添加业务断言验证结果 } }
- 如果确认
ConvertUtility是final类或者transform是final方法,需要开启Mockito对final类的mock支持:
在项目src/test/resources/mockito-extensions目录下创建名为org.mockito.plugins.MockMaker的文件,写入内容:
mock-maker-inline
即可实现对final类、final方法的mock。
内容的提问来源于stack exchange,提问作者MrRobot9
相关产品推荐
相关产品推荐

