2014-02-20 169 views
3

首先,我想對我的語言技能表示歉意,但我的母語不是英語。無效方法的Java單元測試

我有一點點的源代碼,這是:

public void hello(List l){  
    switch (l.get(0) {  
    case "hello":  
     System.out.println("Hello!");  
    case "world":  
     System.out.println("World");  
     break;  
    }  
} 

而且我必須寫一個單元測試,它可以測試這個代碼。但我的技能還不夠。請有人幫助我嗎?一些例子或書或其他東西。我不知道我該如何開始它!

我很感激。

感謝

回答

4

你不能明顯地測試,如果該方法返回,如果它是「無效」正確的值。但是,您可以測試它是否引發任何異常。如果要測試計算,則需要重構代碼,以便計算是一個返回值的單獨方法。

+0

-1:您的建議非常具有誤導性。 OP **不需要**來重構*方法返回值*以便測試(正如其他答覆者已經清楚地顯示的那樣)。最重要的是,測試方法*是否不拋出*幾乎沒有意義,因爲它沒有提供方法實際執行的信息,使得這種測試無用。 –

+0

如果OP可以修改代碼,那麼重新分解是正確的方法,而不是捕獲輸出流等。 –

2

你應該把你的代碼分成兩種方法 - 一種打印第二種結果,第二種可以很容易地進行單元測試。

+0

你能寫一個關於你的例子的簡單代碼嗎?我不明白你在想什麼100%! :/ 我不是在等待解決方案,只是另一個例子,我可以使用我的問題。 – user3331579

+0

public void a(String i){System.out.println(b(i)); } //單元測試 public String b(String i){if(「a」.equals(i「)){return」b「;} else {return」c「;}} // unit testabkle – Smutje

+0

所以if我理解首先我必須更改我的源代碼關於您的示例。然後我必須對新的源代碼進行單元測試? – user3331579

1

爲了能夠測試此方法,您必須能夠知道已打印到System.out的內容。因此,您必須將System.out替換爲另一個流,並將其寫入內存,以便在調用該方法後檢查流的內容。這是可行的,但不是那麼容易。

如果不是打印到System.out,它會使您的方法更具可重用性和更多可測試性,而不是打印到System.out。你也可以傳遞PrintStream類型的附加參數,方法可以寫入該參數,這樣可以通過傳遞一個可以寫入字節數組的PrintStream來簡化測試。

1

你可以像這樣(使用Mockito)將輸出流更改爲模擬的輸出流。

PrintStream mockStream = Mockito.mock(PrintStream.class); 
PrintStream original = System.out; 
System.out = mockStream; 

//call your method here: 
hello(myList); 

//check if your method has done its job correctly 
Mockito.verify(mockStream).println("Hello!"); 
//clean up 
System.out = orig; 

另外,不要忘記把你的break第一案後或將告吹並打印第二次爲好。

+0

謝謝!所以,如果我低調,我必須把我的源代碼放在/ /在這裏調用你的方法?或者你寫給我的這個代碼是可以測試單元測試的,或者是什麼?對不起,但我完全不明白! :/ – user3331579

2

你可以通過啓動一個新的JVM,並調用調用此則捕捉輸出代碼測試的方法,但是......

簡單重構代碼,這樣你就可以測試是:提取了一種方法,返回一個字符串,留下一個打印結果的包裝方法,但是你測試提取的方法。