[英]Alternatives to mock an static method
我正在開發一個桌面應用程序,我想測試MyClass
的方法foo
,並且有以下情況:
我的課:
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。
我的問題是,有什么干凈的方法可以避免拋出此錯誤?
我正在使用模仿,據我所知, 靜態方法不能被模仿 。
在其他情況下,我可以做這樣的事情:
MainWindow mainWindow = Mockito.mock(MainWindow.class);
但是MainWindow
不在MyClass
中設置,因此這也不是很有用。
最后,我想出了一種解決方法,可以解決我想要的問題,但它不是很干凈。 基本上,我已經聲明了一個靜態布爾標志printText
,並將其在MainWindow
開始處設置為false
,並且在類構造函數中將其設置為true。 然后,在printInMain
,僅當此標志為true時才打印,這僅在先前已實例化此類的情況下才會發生。
這種方法可行,但是我想知道是否有比此更好的解決方案,可能是使用Mockito或其他模擬或測試技術,因為我對它們並不十分熟悉。
我認為這不是一個很好的選擇,因為我只是在應用程序中添加一些代碼以使測試正常工作,並且測試應該適應我的代碼,而不適合我的測試代碼。
在靜態方法中放入空指針檢查時,可以避免拋出NPE。 它有點代碼氣味。
我建議將jTextArea
聲明為非靜態的,這反過來又意味着printInMain
方法也將是非靜態的。 然后,這導致它可以被嘲笑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.