java - 模拟静态方法的替代方法

标签 java junit static mocking mockito

我正在开发一个桌面应用程序,我想测试 MyClass 的方法 foo ,我有以下场景:
我的类(class):

import package.MainWindow;

public class MyClass{

    public int foo(){
        //some logic
        // . . .
        boolean result = getResult();
        if (result) {
            MainWindow.printInMain("Success");
            return 1;
        } else {
            MainWindow.printInMain("Fail: " + getCommentsAsString());
            return 2;
        }
    }
}

然后,我有 MainWindow 及其静态方法 printInMain:

public class MainWindow{

    private static JTextArea jTextArea;

    MainWindow(){
        jTextArea = new JTextArea();
    }

    public static void printInMain(String string) {
        jTextArea.append(string + "\n");
        try {
           jTextArea.setCaretPosition(jTextArea.
             getLineStartOffset(jTextArea.getLineCount() - 1));
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
    }
}

MainWindow 是我的程序的界面,jTextArea 是 swing 组件,用于打印我从 MyClass.foo() 发送的信息。
现在我正在使用 jUnit 测试 foo() ,并且不需要图形用户界面来测试它。测试非常简单,但在调用打印方法时出现 nullPointer 异常,因为 MainWindow 尚未实例化,因此 jTextArea 为 null。
我的问题是,有没有什么干净的方法可以避免抛出这个错误?
我正在使用mockito,据我所知,static methods cannot be mocked .
在其他一些情况下,我可以这样做:

MainWindow mainWindow = Mockito.mock(MainWindow.class);

但是 MyClass 中没有设置 MainWindow,因此这也不是很有用。
最后我想出了一个解决方法,可以满足我的要求,但它不是很干净。基本上我已经声明了一个静态 boolean 标志 printText 并在 MainWindow 的开头将其设置为 false,并且我将其设置为 true类构造函数。然后,在 printInMain 中,我仅在该标志为 true 时进行打印,只有在此类先前已实例化时才会发生这种情况。
这种方法有效,但我想知道是否有比这更好的解决方案,也许使用 Mockito 或其他一些模拟或测试技术,因为我对它们不是很熟悉。
我认为这不是一个很好的选择,因为我在应用程序中添加一些代码只是为了使测试工作,并且测试应该适应我的代码,而不是适应我的测试的代码。

最佳答案

虽然在静态方法中放置空指针检查可以避免抛出 NPE;它有点代码味道。

我建议将jTextArea 声明为非静态,这反过来意味着printInMain 方法也将是非静态的。这会导致它被 mock 。

关于java - 模拟静态方法的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30027626/

相关文章:

Junit中eclipse中的Java play框架错误

Java重绘重复图像

java - Netbeans 代码生成问题 : How to edit auto generated code?

scala - 在Gradle中指定单元测试位置

c++ - 在 OpenMP 中使静态类成员线程私有(private)

c# - 在不同的泛型类实例之间共享静态字段

C++ static-only 类分配

java - 如何限制下拉列表中的值?

java - 当按下键盘上的某个键时结束程序

java - getRequests() 必须返回一个可迭代的数组