如何Mock工厂类,使其返回携带相同参数的真实C对象?
Mock工厂类返回真实实例的实现方案
没问题,我来帮你搞定这个需求!下面以Java常用的Mockito框架为例,给你详细的解决方案:
首先先明确我们的基础类结构,方便你对照自己的代码:
// C类,构造函数接收两个参数 public class C { private final String param1; private final int param2; public C(String param1, int param2) { this.param1 = param1; this.param2 = param2; } // 可选:添加getter方法用于验证结果 public String getParam1() { return param1; } public int getParam2() { return param2; } } // 工厂类接口(如果你的工厂是类而非接口,也可以用Mockito处理,后面会说明) public interface Factory { C create(String param1, int param2); }
接下来是核心的Mock配置和测试代码:
import org.junit.Test; import org.mockito.Mockito; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; public class FactoryMockTest { @Test public void testMockFactoryReturnsRealCInstance() { // 1. 创建Factory的Mock对象 Factory mockFactory = Mockito.mock(Factory.class); // 2. 配置create方法的行为:根据传入参数返回真实的C实例 when(mockFactory.create(Mockito.anyString(), Mockito.anyInt())) .thenAnswer(invocation -> { // 获取调用create时传入的两个参数 String inputParam1 = invocation.getArgument(0); int inputParam2 = invocation.getArgument(1); // 用这些参数实例化真实的C对象并返回 return new C(inputParam1, inputParam2); }); // 3. 调用Mock工厂的create方法 C createdInstance = mockFactory.create("hello", 456); // 4. 验证返回的确实是用传入参数创建的真实C对象 assertEquals("hello", createdInstance.getParam1()); assertEquals(456, createdInstance.getParam2()); } }
关键细节说明:
thenAnswer是Mockito里的核心方法,它允许我们自定义方法调用的返回逻辑,而不是返回预先设定的固定对象。invocation.getArgument(index)用于获取方法调用时传入的参数,索引从0开始对应方法的第一个参数。- 如果你的Factory是具体类而非接口:只要这个类不是final的,Mockito就能正常Mock它;如果是final类,你需要在Mockito的配置文件(
src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker)中添加mock-maker-inline来支持Mock final类。
如果使用其他Mock框架(比如EasyMock、PowerMock),核心思路也是一致的:捕获方法调用的参数,然后用这些参数实例化真实的C对象返回。Mockito因为易用性和普及度,是最推荐的选择。
内容的提问来源于stack exchange,提问作者guijob
相关产品推荐
相关产品推荐

