Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用JMockit在抽象类中模拟非公共静态方法?_Java_Unit Testing_Mocking_Jmockit - Fatal编程技术网

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

Java 用JMockit在抽象类中模拟非公共静态方法?,java,unit-testing,mocking,jmockit,Java,Unit Testing,Mocking,Jmockit,我有以下课程: public abstract class AbstractParent { static String method() { return "OriginalOutput"; } } 我想嘲笑这种方法。我决定使用。因此,我创建了一个模拟类: public class MockParent { static String method() { return "MOCK"; } } 我的测试代码如下所示: publ

我有以下课程:

public abstract class AbstractParent {
    static String method() {
        return "OriginalOutput";
    }
}
我想嘲笑这种方法。我决定使用。因此,我创建了一个模拟类:

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


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

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

我不知道为什么这样做有效,而原来的方法不起作用(欢迎有人加入),但您只需将上面示例中的mock类更改为:

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

显然,新的方法是使用
MockUp


新建实体模型。

您甚至不必在MockParent.jmock中将其设置为静态。jmock只查看公共方法。这允许您的模拟实现具有与源类中的方法不对应的内部方法。模拟方法需要公开的原因是JMockit修改模拟方法以调用模拟方法。也就是说,对原始方法的调用从同一方法内部重定向到mock。因此,mock方法必须可以从插入调用的位置进行访问。仅对经过的Google用户而言..接受的答案现在已过时为Mockit.refinethods已被弃用…我正在尝试找到正确的方法。原始的
AbstractParent.method()
静态的
。这种方法不能用于
静态方法。@Adeel我请求不同,很抱歉我之前的评论,实际上我试过了,但它没有真正起作用,然后我知道那是因为完全不同的东西+1为提供示例。
new MockUp<AbstractParent>(){
    @Mock String method() {
        return "MOCK";
    }
};

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