我正在开发一个桌面应用程序,我想测试 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/