使用JMockit在抽象类中模拟非公共静态方法?

时间:2008-10-22 07:05:41

标签: java unit-testing mocking jmockit

我有以下课程:

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,您应该能够模拟任何范围的方法。

答案只有模拟方法需要公开,您可以保留原始方法。

2 个答案:

答案 0 :(得分:6)

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

我不知道为什么这种方法有效,而原始方式却没有(有人欢迎加入),但你需要做的只是将上面例子中的mock类改为: / p>

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

答案 1 :(得分:4)

显然,新方法是使用MockUp<T>

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

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

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

我已在示例project on github中实现了这一点。