我可以模拟超类方法调用吗?
有时,您希望测试一个类方法,并且想要对超类方法的调用执行期望。我没有找到一种方法来使用easymock或jmock在java中实现这种期望(我认为这是不可能的)。
有一个(相对的)干净的解决方案,创建一个具有超类方法逻辑的委托,然后对其设定期望,但我不知道为什么以及何时使用该解决方案¿任何想法/示例?
谢谢
有时,您希望测试一个类方法,并且想要对超类方法的调用执行期望。我没有找到一种方法来使用easymock或jmock在java中实现这种期望(我认为这是不可能的)。
有一个(相对的)干净的解决方案,创建一个具有超类方法逻辑的委托,然后对其设定期望,但我不知道为什么以及何时使用该解决方案¿任何想法/示例?
谢谢
好吧,如果你愿意,你可以。我不知道你是否熟悉JMockit,去看看吧。当前版本是0.999.17 同时,让我们来看看它...
假定以下类层次结构:
public class Bar {
public void bar() {
System.out.println("Bar#bar()");
}
}
public class Foo extends Bar {
public void bar() {
super.bar();
System.out.println("Foo#bar()");
}
}
然后,在 JMockit 中使用 JMockit,您可以验证是否确实从 调用了 。FooTest.java
Bar
Foo
@MockClass(realClass = Bar.class)
public static class MockBar {
private boolean barCalled = false;
@Mock
public void bar() {
this.barCalled = true;
System.out.println("mocked bar");
}
}
@Test
public void barShouldCallSuperBar() {
MockBar mockBar = new MockBar();
Mockit.setUpMock(Bar.class, mockBar);
Foo foo = new Foo();
foo.bar();
Assert.assertTrue(mockBar.barCalled);
Mockit.tearDownMocks();
}
扩展@Cem Catikkas答案,使用JMockit 1.22:
@Test
public void barShouldCallSuperBar() {
new MockUp<Bar>() {
@Mock
public void bar() {
barCalled = true;
System.out.println("mocked bar");
}
};
Foo foo = new Foo();
foo.bar();
Assert.assertTrue(mockBar.barCalled);
}
不需要用@MockClass注释的静态类,它被 MockUp 类替换。