根据the example in the Jmockit tutorial,这段代码可以解决问题:
@BeforeClass
public static void setUpClass() {
new MockUp<UtilJndi>(){
@Mock
public static String getDirectoryFromContext(Property jndiName) // line 66
throws DirectoryNotFoundException {
return "noDirectory";
}
};
}
但它显示:
myclass.java:[66,29]错误:非法静态声明
我该如何解决这个问题?
我将添加另一种对我有用的解决方法:
我创建了我的模拟类,扩展了MockUp:
public static class MockUtilJndi extends MockUp<UtilJndi> {
public MockUtilJndi() {
super();
}
@Mock
public static String getDirectoryFromContext(Property jndiName)
throws DirectoryNotFoundException {
return "noDirectory";
}
}
如果你注意到我在构造函数中调用了super()。根据文档的原因,如果你调用MockUp构造函数,它将改变目标类中的实现..所以一旦你在你的模拟类构造函数中有这个,你只需要在@BeforeClass注释方法中创建你的类:
@BeforeClass
public static void setUpClass() {
new MockUtilJndi();
}
答案 0 :(得分:7)
好的,我会将我的评论更新为答案。
首先,错误信息非常清楚。 “非法静态声明”只是意味着 static 关键字被置错了。删除它!
当您尝试模拟静态方法时,您可能认为必须同时放置static关键字。但是documentation for the Mock annotation说:
然而,方法修饰符(包括public,final,甚至static)不必相同。
这只是意味着,即使不将其声明为静态,也可以模拟静态方法。
嗯......我强烈地感觉到,文档的措辞有点令人困惑。显然,它不是一个选项,但你不能将它声明为静态。