在类之前使用jmockit(1.5)模拟静态方法

5
根据Jmockit教程中的示例,以下代码应该可以解决问题:
@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();
}

第 66 行是哪一行? - Duncan Jones
公共静态字符串 getDirectoryFromContext(Property jndiName) 从上下文获取目录。 - adrian.riobo
1
虽然我不了解JMockit,但问题对我来说似乎非常清楚。错误信息“非法静态声明”告诉你一切。这个“static”是错误的。此外,您链接的示例在此处未使用静态方法。您是如何相信必须在那里放置静态方法的?(令人困惑...) - Seelenvirtuose
好的,如果这里不是合适的地方,你可以告诉我如何在类之前模拟静态方法吗? - adrian.riobo
1个回答

7

好的,我会将我的评论更新为答案。

首先,错误信息非常清晰。 "Illegal static declaration" 只是意味着 static 关键字放错了位置。删除它!

由于您正在尝试模拟一个静态方法,您可能认为您也必须放置 static 关键字。但是 Mock 注释的文档 表示:

方法修饰符(包括 public、final 甚至 static)不必相同。

这就意味着,即使没有声明为 static,您也可以模拟静态方法。

嗯...我强烈感觉,文档措辞有点令人困惑。显然,这不是一个选项,但您不能声明它为 static。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接