簡體   English   中英

模擬靜態方法的替代方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM