Mockito when().thenReturn()失效:测试进入真实方法求助
问题排查与解决方案
你的测试中when().thenReturn()不生效、执行真实方法的核心原因有以下几点,对应修复步骤如下:
1. 构造参数顺序完全颠倒
ClassC的@AllArgsConstructor生成的构造函数参数顺序是ClassB在前、ClassA在后,但你在测试的init方法中实例化ClassC时,传入的是classA, classB——这直接导致ClassC内部的classB引用指向了测试中的classA实例,classA引用指向了测试中的classB实例。你对classA和classB的mock设置完全不作用于ClassC实际使用的对象,自然会执行真实逻辑。
修复:修正ClassC实例化的参数顺序:
classC = new ClassC(classB, classA);
2. Mock对象初始化时机错误
你使用了@ExtendWith(MockitoExtension.class),这个扩展会自动初始化@Mock注解的对象,不需要手动调用MockitoAnnotations.openMocks(this)。而且你先实例化ClassC、再初始化Mock的顺序,会导致ClassC拿到的是未初始化的null对象(后续Mock对象初始化后也不会同步到ClassC的引用中)。
修复:移除手动初始化代码,确保Mock对象就绪后再创建ClassC:
@BeforeAll void init() { // Mock对象已被MockitoExtension自动初始化 classC = new ClassC(classB, classA); }
3. 语法错误导致Mock设置失效
你的代码里少了一个右括号,这会导致这条Mock语句不生效:
// 错误写法 when(classB.methodInClassB(classE).thenReturn(classD); // 正确写法 when(classB.methodInClassB(classE)).thenReturn(classD);
4. 额外排查点:final类/方法问题
如果ClassA是final类,或者apply方法是final修饰的,Mockito默认无法Mock这类方法,会直接执行真实逻辑。这种情况需要添加mockito-inline依赖来支持Mock final类/方法(以Maven为例):
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency>
修复后的完整测试代码
@TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith(MockitoExtension.class) class ClassTest { @Mock private ClassA classA; @Mock private ClassB classB; private ClassC classC; @BeforeAll void init() { classC = new ClassC(classB, classA); } @Test @DisplayName("Test description") void first_test() { ClassD classD = new ClassD(); ClassE classE = new ClassE(); when(classB.methodInClassB(classE)).thenReturn(classD); ClassF classF = new ClassF(); when(classA.apply(classD)).thenReturn(classF); ClassE compute = classC.apply(classE); verify(classB).methodInClassB(classE); verify(classA).apply(classD); } }
内容的提问来源于stack exchange,提问作者MatijaT
相关产品推荐
相关产品推荐

