7

我有以下课程:

public abstract class AbstractParent {
    static String method() {
        return "OriginalOutput";
    }
}

我想模拟这种方法。我决定使用JMockit。所以我创建了一个模拟类:

public class MockParent {
    static String method() {
        return "MOCK";
    }
}

我的测试代码如下所示:

public class RealParentTest {

    @Before
    public void setUp() throws Exception {
        Mockit.redefineMethods( AbstractParent.class, MockParent.class );
    }


    @Test
    public void testMethod() {
        assertEquals(MockParent.method(),AbstractParent.method());
    }

}

不幸的是,这个测试表明 AbstractParent 返回“OriginalOutput”而不是“MOCK”。任何想法为什么?难道我做错了什么?我也尝试将我的模拟类声明为抽象类,但无济于事。

编辑请注意,公开该方法会导致测试运行没有问题......这很奇怪,因为使用 JMockit 您应该能够模拟任何范围的方法。

回答只有模拟方法需要公开,您可以保持原始方法不变。

4

2 回答 2

6

找到了解决方案:您只需要将模拟的方法公开(原始方法可以保持其原始可见性)。

我不知道为什么这行得通,而原始方式却不行(非常欢迎有人加入),但您只需将上面示例中的模拟类更改为:

public class MockParent {
    public static String method() {
        return "MOCK";
    }
}
于 2008-10-22T07:42:24.330 回答
4

显然,这样做的新方法是使用MockUp<T>

new MockUp<AbstractParent>(){
    @Mock String method() {
        return "MOCK";
    }
};

assertEquals("MOCK" AbstractParent.method());

另一种选择显然是继续使用annonation之类MockParent的东西。@MockClass我自己没有这样做,因为另一个内联版本可以完成这项工作。

我已经在 github 上的示例项目中实现了这一点。

于 2010-12-14T13:49:48.910 回答