如何在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
相关产品推荐
相关产品推荐

