2013-11-20 71 views
2

我需要爲永不結束的main()方法編寫JUnit測試用例。處理某些文件後,這個main()方法會休眠一分鐘,然後繼續執行。這個過程繼續,繼續。如何覆蓋失敗的JUnit測試用例的行爲

我用下面的代碼寫的JUnit它:

@Test (timeout = 10000) 
public void testMainMethod() 
{ 
    ClassName.main(null); 
    assertEquals(true, true); 
} 

並沒有驚喜,我的測試案例失敗,java.lang.Exception的:後10000毫秒消息測試超時。即使main()方法按預期工作,該測試用例也將因超時異常而失敗。我怎麼能重寫這個失敗的測試用例的行爲,以便在超時異常的情況下,它應該顯示結果爲「成功」這個測試用例。

編輯 的實際要求是: 我需要從一個特定的位置搜索文件,如有發現任何,然後將其移動到不同的文件夾中。這個搜索應該每30分鐘完成一次。爲此,我使用了下面的代碼:

public class FaxProcessor { 
public static void main(String[] args) { 
     LOGGER.info("*** Starting Fax Server Processor ***"); 
     int poll_time = 1800000; 
     LOGGER.info("Poll Time set to " + poll_time + " millisec"); 

     FaxProcessor faxProcessor = new FaxProcessor(); 

     while (true) { 
      try { 
       if(LOGGER.debugEnabled()){ 
        LOGGER.debug("Starting new pass of fax processor"); 
       } 
       faxProcessor.startProcessing(); 
      } catch (Exception e) { 
       LOGGER.error("Processing Error", e); 
      } finally { 
       try { 
        // Wait for next loop 
        Thread.sleep(poll_time); 
       } catch (InterruptedException e) { 
        LOGGER.error("Thread Exception", e); 
       } 
      } 
     } 
    } 
    // startProcessing and other private methods here 
} 

最大的問題是,我只有一個公共方法{main()方法}和所有其他人都是私人,所以我不能寫JUnit測試用例他們。另外,main()方法不會返回任何東西,它只會將文件從一個文件夾移動到另一個文件夾,並且如果它在一次傳遞中移動文件失敗,它將嘗試在下一個傳遞中執行相同的操作。因此,使用JUnit測試用例,我只想檢查整個過程中是否發生意外異常。

如果我不會在JUnit中指定超時,那麼測試用例永遠不會完成。一旦發生超時,我想檢查測試用例是否由於Timeout異常而完成,或者是否有其他異常來自於引發JUnit測試用例的main()方法。

如果是超時異常,這意味着,我的程序中的所有內容都沿着正確的方向運行,直到超時發生,所以測試用例應該成功。在所有其他情況下,它應該顯示FAILED爲JUnit狀態。

+0

這很混亂。 1)爲什麼總會有成功的assertEquals()?只是把它留下。 2)你想測試什麼?該main()運行至少10'000毫秒,而不拋出異常? 3)你如何從main()返回?也許你應該通過一個參數,告訴它在一定數量的循環後停止。 –

+0

單元測試不是黑盒測試!良好的單元測試是白盒測試,所以您應該測試主要方法中發生的步驟(這應該是其他方法)。 –

回答

-1

我不明白你想要做什麼。 如果您遇到超時異常,這意味着測試用例運行時間過長。

如果要測試主方法,並且它包含無限循環,如何確定該方法按預期方式工作?

對於您的問題,使用

@Test (timeout = 10000, expected=Exception.class) 
0

你應該考慮分離長時間運行的單元測試。如何實現,例如shown herehere

1

您已經人爲地限制了您的測試環境,並聲明如下:「我只有一​​個公共方法{main()方法},而其他所有方法都是私有的」 - 誰說?如果這是你老師強加的要求,那麼你應該認真考慮離開課堂。

1)正確的測試意味着測試a)候選文件被識別,b)候選文件被移動,以及c)操作定期發生。

2)將你的主程序分解爲無限循環控制部分和工作部分。更好的是,使等待間隔是一個計算值。

3)使用protected方法代替私有方法。由於它們受到保護,現在可以使用子類來訪問所需的方法,而不會違反必要的封裝。