如何用Mockito模拟BooleanUtils类或应用属性以测试分支逻辑
解决方法
你不需要模拟BooleanUtils类,核心是控制needToCheck属性的值,就能覆盖对应的if分支。原因很简单:if分支的触发条件完全由needToCheck的取值决定,BooleanUtils.isTrue只是做了空安全的判断,只要needToCheck为true,这个方法自然会返回true,没必要模拟静态工具类。
下面是两种可行的测试方案:
方案1:用反射设置私有属性(纯Mockito环境)
因为needToCheck是私有属性,我们可以通过反射直接修改它的值,再调用私有方法进行测试:
@ExtendWith(MockitoExtension.class) class OperationMovementTest { @InjectMocks private OperationMovement operationMovement; @Test void testCheckOperation_NeedCheckTrue() throws Exception { // 反射修改needToCheck为true Field needToCheckField = OperationMovement.class.getDeclaredField("needToCheck"); needToCheckField.setAccessible(true); needToCheckField.set(operationMovement, Boolean.TRUE); // 反射调用私有方法checkOperation Method checkMethod = OperationMovement.class.getDeclaredMethod("checkOperation"); checkMethod.setAccessible(true); checkMethod.invoke(operationMovement); // 这里添加断言,比如验证if分支内的逻辑是否执行(比如依赖的方法被调用) // 示例:verify(someMock).doSomething(); } @Test void testCheckOperation_NeedCheckFalse() throws Exception { // 设置needToCheck为false Field needToCheckField = OperationMovement.class.getDeclaredField("needToCheck"); needToCheckField.setAccessible(true); needToCheckField.set(operationMovement, Boolean.FALSE); Method checkMethod = OperationMovement.class.getDeclaredMethod("checkOperation"); checkMethod.setAccessible(true); checkMethod.invoke(operationMovement); // 验证非if分支的逻辑 } }
方案2:用Spring测试框架注入属性(如果是Spring项目)
如果你的项目是Spring Boot,可以直接通过测试配置注入operation.check的值:
@SpringBootTest @TestPropertySource(properties = {"operation.check=true"}) class OperationMovementSpringTest { @Autowired private OperationMovement operationMovement; @Test void testCheckOperation_NeedCheckTrue() throws Exception { Method checkMethod = OperationMovement.class.getDeclaredMethod("checkOperation"); checkMethod.setAccessible(true); checkMethod.invoke(operationMovement); // 断言逻辑 } }
为什么之前的模拟方式会报错
BooleanUtils是静态工具类,Mockito默认只能模拟对象实例,不能直接模拟静态方法。虽然Mockito 3.4+支持mockStatic来模拟静态方法,但这里完全没必要——我们的目标是触发if分支,只要控制needToCheck的取值就足够了,模拟静态工具类属于画蛇添足。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

