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

如何在JMockit中实现测试复用类的Mock注入并在测试类中使用?

用JMockit实现带内部Mock的测试复用类实例化

问题场景

你有一个包含@Mocked字段的测试复用类,需要在测试类中创建该类的实例,且确保其内部的Mock对象已完成注入:

复用类代码:

class MyReusableClassForTesting {

    @Mocked
    private ClassA attribute;

    // 更多@Mocked字段及依赖Mock的方法
}

测试类需求:

class MyTestClass {

    // 需要这个实例内部的Mock已完成注入
    private MyReusableClassForTesting instance;
}

之前尝试@Mocked、@Capturing、@Tested、@Injectable等注解均未生效,以下是可行的解决方案:

解决方案

JMockit默认只会自动初始化测试类本身的@Mocked字段,对于测试类中其他类实例的内部Mock,需要手动调用API触发注入,具体有两种实现方式:

方式一:在测试类的初始化方法中触发Mock注入

在测试类的@Before方法中创建复用类实例,然后调用Mockit.setUpMocks()方法初始化其内部Mock:

import mockit.Mockit;
import org.junit.Before;
import org.junit.Test;

class MyTestClass {

    private MyReusableClassForTesting instance;

    @Before
    public void setUp() {
        instance = new MyReusableClassForTesting();
        Mockit.setUpMocks(instance); // 触发复用类内部Mock的初始化
    }

    @Test
    public void testWithReusableMock() {
        // 直接使用instance,其内部的Mock已就绪
        instance.doSomethingWithMock();
        // 这里可以添加Mock方法调用验证逻辑
    }
}

方式二:在复用类的构造方法中自动初始化Mock

修改复用类的构造方法,在内部调用Mockit.setUpMocks(this),这样创建实例时会自动完成内部Mock的注入:

import mockit.Mockit;

class MyReusableClassForTesting {

    @Mocked
    private ClassA attribute;

    public MyReusableClassForTesting() {
        Mockit.setUpMocks(this); // 实例化时自动初始化内部Mock
    }

    // 依赖Mock的方法示例
    public void doSomethingWithMock() {
        attribute.someMethod();
    }
}

// 测试类中直接创建实例即可
class MyTestClass {

    private MyReusableClassForTesting instance = new MyReusableClassForTesting();

    @Test
    public void testWithReusableMock() {
        instance.doSomethingWithMock();
    }
}

注解失效原因说明

@Tested、@Injectable等注解主要用于处理测试类自身的依赖注入,或是测试类中被@Tested标记的目标类的依赖注入,不会自动处理普通字段(如上述复用类实例)内部的@Mocked字段,因此必须手动调用Mockit.setUpMocks()来触发该实例内部的Mock初始化流程。

内容的提问来源于stack exchange,提问作者Kannan Ramamoorthy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:15:48