2014-12-22 127 views
2

我似乎無法在網上找到的任何教程,解決這個如何測試junit語句?

我有這個if聲明:

if (basket.getCustomerId() != null) { 
       Basket exBasket = findBasketByCustomerId(basket.getCustomerId()); 
       if (exBasket != null && exBasket.getBasketId() != null) { 
        return exBasket; 
       } 

,我想要寫一個單元測試,將測試每根線,看它是否正在做正確的事情。

任何想法?

@Test 
    public void testBasketWithANullCustomerId(){ 
     basketInformationServiceImpl.createBasket(mockBasket); 
     assertNotNull(mockBasket.getCustomerId()); 
    } 

回答

8

單元測試的目的不是爲了測試語句方法。正確的做法是不考慮這條線,而是考慮它出現的方法,並詢問你想要該方法做什麼:它需要什麼類型的輸入以及它應該產生什麼類型的輸出?

然後編寫需要一些典型投入測試,並檢查他們給正確的輸出,也有一些邊緣情況輸入(如null,0,Integer.MAX_VALUE等),並檢查是否得到正確的輸出對於那些也是。

如果這是你的整個方法(實際上這是不可能的,但如果是它的本質),我想測試:

  • 一個basketnull客戶ID;
  • a null購物籃(除非你確定這永遠不會發生),因爲目前這段代碼會給出NullPointerException;
  • 有一個顧客編號的籃子,可以讓你找到一個已知的exBasket;
  • 一個購物籃,其客戶ID將返回exBasketnull;
  • 具有客戶ID的購物籃將返回非空的exBasket,但其購物籃ID爲null
+0

沒關係。但你怎麼寫一個測試來測試語句。我無法弄清楚語法的樣子。 我想要一些方法來測試它是否爲空,然後返回if語句的其餘部分。不知道如何去做。謝謝 – BlueShark

+0

@BlueShark我認爲你看錯了方式。正如我所說,不要考慮測試*聲明*。考慮*輸入和輸出*。 –

+0

好的,看看我的問題,爲您的第一個要點提供更新的答案。它是否正確? – BlueShark

0

假設這是一個你試圖測試的方法的摘錄,這聽起來像你至少需要兩個測試用例 - 其中basket.getCustomerId()預期爲null,而另一個則不是。在這兩種情況下,您都應該能夠測試該方法的返回值(假設Basket將返回以及在getCustomerId()爲空的情況下)與預期結果相比較。

0

要以您似乎想要的方式(強調行覆蓋率)進行測試,您需要針對您要測試的每種情況進行測試(例如,針對空basketId的一個測試,針對非null basketId的另一個測試,另一種情況下你想測試)。

模擬框架(如Mockito)可用於設置測試的先決條件。舉一個例子,你可以說

@Test 
public void myTestWithNonNullBasketId() { 
    Basket inputBasket = Mockito.mock(Basket.class); 
    when(inputBasket.getBasketId()).thenReturn(1); //Or whatever we want basketId to return, null if you want to check that case. 
    ... //More mocking as needed, presumably to dictate whatever findBasketByCustomerId might return. 

    //Call the method you are testing, use org.junit.Assert assertions to check outputs. 
}