如何在JUnit 5中设置Mock对象为null覆盖null判断测试分支
问题解决方案
核心前提:@Mock注解生成的是Mockito代理实例,本身永远不可能为null,你不需要把Mock对象改成null,只要让被测类中持有的appConfig字段值为null,就能覆盖对应判断分支。
下面是两种JUnit 5环境下最常用的实现方式:
- 方式一:通过反射直接给被测类字段赋值null(最推荐,代码侵入性最低)
不需要依赖注入逻辑,直接初始化被测类后,把私有字段appConfig设为null即可,一般用Spring测试包自带的ReflectionTestUtils最简洁,没有Spring依赖也可以用JUnit5自带的反射工具实现。
无Spring依赖时用JUnit5原生反射工具的写法:import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; @Test void whenAppConfigIsNull_thenTriggerConfigCheck() { // 实例化被测服务类 MyService service = new MyService(); // 直接将服务类内的私有appConfig字段设为null ReflectionTestUtils.setField(service, "appConfig", null); // 调用包含null判断的业务方法 service.doBusiness(); // 编写对应断言,验证配置检查分支的执行结果 }import org.junit.jupiter.api.Test; import org.junit.platform.commons.util.ReflectionUtils; import java.lang.reflect.Field; @Test void whenAppConfigIsNull_thenTriggerConfigCheck() throws IllegalAccessException { MyService service = new MyService(); Field configField = ReflectionUtils.findFields(MyService.class, f -> f.getName().equals("appConfig"), ReflectionUtils.HierarchyTraversalMode.TOP_DOWN) .get(0); configField.setAccessible(true); configField.set(service, null); // 调用业务方法+断言逻辑 } - 方式二:重置Mock引用后重新注入,适配
@InjectMocks的测试类结构
如果你整个测试类都是用@Mock+@InjectMocks的注解结构写的,可以单独为null分支写测试方法,先把测试类中的appConfig引用置为null,再重新执行Mockito注入,被测类拿到的字段值就会是null。import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; // 测试类中可以正常保留全局注解声明 @Mock private Config appConfig; @InjectMocks private MyService myService; @Test void testNormalLogicWithValidConfig() { // 正常非null分支的测试逻辑,给appConfig打桩即可 // when(appConfig.getXxx()).thenReturn(xxx); } @Test void whenAppConfigIsNull_thenTriggerConfigCheck() { // 先将测试类持有的appConfig引用置为null appConfig = null; // 重新执行依赖注入,此时被测类的appConfig字段会被注入null MockitoAnnotations.openMocks(this); // 调用业务方法+断言分支逻辑 }
注意:不要试图通过给Mock对象打桩的方式实现这个场景,你代码里判断的是
appConfig实例本身为null,不是调用appConfig的方法返回null,打桩无法触发这个分支。
内容的提问来源于stack exchange,提问作者Saravanakumar Arunachalam
相关产品推荐
相关产品推荐

