JUnit参数化测试中EasyMock的@Mock对象为空问题及创建可行性咨询
当然可以在参数化测试类中使用EasyMock创建模拟对象!你遇到的mockClassB为空的问题,核心原因是JUnit 4仅支持指定一个测试Runner——你当前用了@RunWith(Parameterized.class),导致EasyMock的@Mock注解无法被它专属的EasyMockRunner处理,模拟对象自然没有被初始化。
下面给你两种可行的解决方案:
方案一:使用EasyMockRule(推荐)
JUnit的Rule机制允许我们在不替换主Runner的前提下,扩展测试功能。EasyMock提供了EasyMockRule,可以自动处理@Mock注解的初始化工作,完美适配参数化测试场景。
修改后的代码示例:
@RunWith(Parameterized.class) public class ClassATest extends EasyMockSupport { private String uniqueIdentifier; private String value; // 添加EasyMockRule,让它处理当前类的@Mock注解 @Rule public EasyMockRule easyMockRule = new EasyMockRule(this); @Mock private ClassB mockClassB; public ClassATest(String uniqueIdentifier, String value) { this.uniqueIdentifier = uniqueIdentifier; this.value = value; } @Parameterized.Parameters(name = "{index}: id = {0}; value = {1}") public static Collection<Object[]> data() { return Arrays.asList(new Object[][]{ {"1", "val1"}, {"2", "val2"} }); } @Test public void testMethod() { expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value); replayAll(); // 执行你的测试逻辑 verifyAll(); } }
方案二:手动初始化模拟对象
如果不想引入Rule,也可以在@Before方法中手动创建模拟对象。Parameterized Runner会在每个测试方法执行前调用@Before方法,确保每次测试都能拿到新鲜的模拟实例。
修改后的代码示例:
@RunWith(Parameterized.class) public class ClassATest extends EasyMockSupport { private String uniqueIdentifier; private String value; private ClassB mockClassB; public ClassATest(String uniqueIdentifier, String value) { this.uniqueIdentifier = uniqueIdentifier; this.value = value; } @Before public void setUp() { // 利用EasyMockSupport的createMock方法创建模拟对象 mockClassB = createMock(ClassB.class); // 也可以用静态方法:mockClassB = EasyMock.mock(ClassB.class); } @Parameterized.Parameters(name = "{index}: id = {0}; value = {1}") public static Collection<Object[]> data() { return Arrays.asList(new Object[][]{ {"1", "val1"}, {"2", "val2"} }); } @Test public void testMethod() { expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value); replayAll(); // 执行你的测试逻辑 verifyAll(); } }
两种方案都能解决mockClassB为空的问题,其中方案一更符合注解驱动的开发风格,减少手动初始化的代码,更推荐使用。
内容的提问来源于stack exchange,提问作者Cyril Dragomyr
相关产品推荐
相关产品推荐

