如何使用Mockito Mock外部方法调用设置的局部变量以测试if分支逻辑
单元测试覆盖if分支实现方案
核心实现思路:借助Mockito框架mockGreetingService的getGreeting方法,通过Answer回调主动修改传入的AtomicReference参数值,使其满足if分支的判断条件,即可完成对应逻辑覆盖。
完整测试代码示例
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.concurrent.atomic.AtomicReference; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class ExampleTest { // Mock依赖的GreetingService实例 @Mock private GreetingService greetService; // 注入Mock依赖到待测试的Example实例 @InjectMocks private Example example; // 测试覆盖if分支:temp.get()非空场景 @Test public void testGreetIfBranch() { // 准备测试数据 String inputName = "测试用户"; String mockReturnGreeting = "Hi"; SomeCustomClass mockCustomInstance = new SomeCustomClass(); // 配置Mock方法的行为:获取调用时传入的AtomicReference参数,主动设置非空值 when(greetService.getGreeting(any(AtomicReference.class))).thenAnswer(invocation -> { AtomicReference<SomeCustomClass> inputTemp = invocation.getArgument(0); // 核心操作:给AtomicReference设置非空值,满足if判断条件 inputTemp.set(mockCustomInstance); return mockReturnGreeting; }); // 执行待测试方法 String actualResult = example.greet(inputName); // 断言结果符合if分支返回逻辑 assertEquals(mockReturnGreeting + " " + inputName, actualResult); } // 可选:测试else分支覆盖 @Test public void testGreetElseBranch() { String inputName = "测试用户"; // Mock方法不修改AtomicReference的值,保持初始null when(greetService.getGreeting(any(AtomicReference.class))).thenReturn("Hi"); String actualResult = example.greet(inputName); assertEquals("Hello, user", actualResult); } }
关键说明
- 测试基于JUnit 5 + Mockito框架,可根据你的项目实际使用的测试框架调整对应注解和API
- 若业务中
SomeCustomClass有必填属性,在构造mockCustomInstance时按需初始化对应字段即可 - 复杂业务场景下,只需要在
thenAnswer的回调中按照真实业务的参数修改逻辑,给传入的AtomicReference设置对应的值即可适配
内容的提问来源于stack exchange,提问作者justAnotherDev
相关产品推荐
相关产品推荐

