2008-10-22 78 views
7

我有以下类:使用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”,而不是“模拟”。任何想法为什么?难道我做错了什么?我已经尝试将我的模拟类声明为抽象类,但无济于事。

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

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

+0

只是为了过关的Google员工......接受的答案现在过时了,因为Mockit.redefineMethods已被废弃......我试图找到正确的答案。 – 2010-12-14 13:06:01

回答

6

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

我不知道为什么这种方法可行,而原来的方式不行(但是,有人做的不仅仅是欢迎来到钟声中),但是您只需要将上例中的模拟类更改为:

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

你甚至不必在MockParent中使其成为静态的。 – 2008-10-22 15:05:16

+1

jmockit仅查看公共方法。这允许你的模拟实现具有与源类中的方法不对应的内部方法 – 2008-10-23 00:10:10

4

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

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

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

另一种选择显然是继续像MockParent@MockClass annonation。由于另一个内联版本完成这项工作,我自己并没有这样做。

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