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