【发布时间】:2017-09-28 17:12:18
【问题描述】:
我有一个场景,我必须在父类中模拟一个方法。该方法是从被测方法调用的。我无法使用 jMockit 模拟该函数。
我的超类是方法如下
public abstract class SuperClass {
protected void emailRecipients(List<String> recipients) {
// Email recipients code. I want to mock this function.
}
}
我的子类如下
public class MyClass extends SuperClass {
public void methodUnderTest(HttpServletRequest request) {
// Some code here.
List<String> recipients = new ArrayList<>();
recipients.add("foo@example.com");
recipients.add("bar@example.com");
// This needs to be mocked.
this.emailRecipients(recipients);
}
}
我尝试过使用partial mocks using jMockit's tutorial,但它对我不起作用。我的测试方法如下。
更新:我执行了 Rogerio 的建议如下。实现仍然调用真正的方法。当我在 Eclipse 中调试模拟类的实例时,这是我看到的 com.project.web.mvc.$Subclass_superClass@6b38c54e
@Test
public void testMethodUnderTest(@Mocked final SuperClass superClass) throws Exception {
final MyClass myClass = new MyClass();
new Expectations(myClass) {{
// .. Other expectations here
superClass.emailRecipients((List<String>) any);
}};
MockHttpServletRequest req = new MockHttpServletRequest();
myClass.methodUnderTest(req);
}
问题是当我尝试模拟emailRecipients 的调用时,它总是尝试调用实际的函数。我正在使用 Java 7、jMockit v1.35 和 Maven 3x 进行构建。
更新代码是旧代码。因此,我们无法更新它。我们不能使用 PowerMock,因为它不在公司批准的库中。我们可以使用 jMockit 或 Mockito 或两者的组合。
【问题讨论】:
-
如果需要模拟
SuperClass,则声明为@Mocked。就这么简单。 -
如果这个遗留代码在未来根本不需要改变,你需要单元测试做什么?
-
我正在编写功能测试。
-
@Rogerio 我需要模拟超类中的函数,而不是超类本身。
-
正如我在最初的评论中提到的,声明一个
@Mocked SuperClass mock字段/参数;然后测试可以记录/验证对模拟超类方法的期望。
标签: java unit-testing jmockit