You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:31:13