我可以模拟超类方法调用吗?

2022-09-02 21:22:20

有时,您希望测试一个类方法,并且想要对超类方法的调用执行期望。我没有找到一种方法来使用easymock或jmock在java中实现这种期望(我认为这是不可能的)。

有一个(相对的)干净的解决方案,创建一个具有超类方法逻辑的委托,然后对其设定期望,但我不知道为什么以及何时使用该解决方案¿任何想法/示例?

谢谢


答案 1

好吧,如果你愿意,你可以。我不知道你是否熟悉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.javaBarFoo

@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();
}

答案 2

扩展@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 类替换。


推荐