2015-11-05 175 views
0

我有一個簡單的測試案例:JUnit測試用例失敗

public class FileManagerTest { 
    String dirPath = 「/myDir/」 
    @Before 
    public void setUp() { 
    mFileManager = MyFileManager.getInstance(); 
    } 

    @Test 
    private void testPersistFiles() { 
     System.out.println(「testPersistFiles()…」); 

     //it deletes old files & persists new files to /myDir/ directory 
     boolean successful =mFileManager.persistFiles(); 

     Assert.assertTrue(successful); 
    } 

    @Test 
    public void testGetFiles() { 
    System.out.println(「testGetFiles()…」); 

    mFileManager.persistFiles(); 
    //I double checked, the persistFiles() works, the files are persisted. 

    List<File> files = mFileManager.getFilesAtPath(dirPath); 
    Assert.assertNotNull(files); //Failure here!!!! 
    } 

    @Test 
    public void testGetFilesMap() { 
    System.out.println(「testGetFilesMap()…」); 

    mFileManager.persistFiles(); 

    Map<String, File> filesMap = mFileManager.getFilesMapAtPath(dirPath); 
    Assert.assertNotNull(files); 
    } 
} 

FileManagerpersistFiles()功能刪除所有文件在/ MYDIR /然後再堅持的文件。

正如您在上面看到的,我在每個測試函數中都有一個System.out.println(…)。當我運行它,我可以看到以下順序全部打印:

testGetFilesMap()… 
testGetFiles()… 
testPersistFiles()… 

然而,測試失敗的testGetFiles()。有兩件事情我不明白:

  1. 我不明白,這是失敗的testGetFiles()爲什麼我仍然可以看到這聽起來像它甚至失敗的打印testPersistFiles(),它不會停止運行,但繼續運行下一個測試testPersistFiles()? JUnit測試用例中幕後發生了什麼?

  2. 我不明白的另一件事是爲什麼testGetFiles()失敗?我可以看到persistFiles()已保存文件的日誌。爲什麼它在那之後變爲空?

+0

我們需要看一些代碼來回答#2。 –

回答

1

我不明白,這是失敗的,在這聽起來像它甚至失敗testGetFiles()爲什麼我仍然可以看到打印testPersistFiles(),我

那是怎麼單元測試工作。每個測試應該被隔離並且僅使用其一組數據進行工作。單元測試框架運行每個測試,以便您可以查看系統的哪些部分可以工作,哪些不需要,他們不會在第一次失敗時停下來。

+0

如果多個測試函數調用persistFiles(),他們是否同步調用此函數? – user842225

+0

可能(但是,默認情況下不會)。然而(假設MyFileManager不是一個單例),它們每個都有一個不同的MyFileManager實例。你還應該使用像[TemporaryFolder](http://junit.org/apidocs/org/junit/rules/TemporaryFolder.html)這樣的每個測試都有自己的空間來玩。 –

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – DJClayworth

0
mFileManager.getFilesAtPath(dirPath); 

你是不是在正確的地方尋找檔案

String dirPath = 「/myDir/」 

你確定這條道路是確定的?用目錄名稱前的斜槓?

0

對於您的每個測試,JUnit都會創建該類的單獨實例並運行它。由於您似乎有3個測試,JUnit會爲您的類創建3個實例,在它們的每個上執行@Before以初始化狀態,然後運行它們。 它們的運行順序通常是寫入測試的順序,但不能保證。

現在關於print語句 - 您會發現它是測試中的第一條語句,因此它將被執行。然後mFileManager.persistFiles();被執行。由於某種原因,它返回一個錯誤,因此測試失敗。

至於爲什麼它返回false,你可以運行一個本地調試器,在該方法的開始處插入一個斷點,單步執行並查看。