2015-11-03 71 views
0

我有2個問題:與私有方法(白箱測試)方法處理很多條件

1)在JUnit中,你不應該測試或模擬私有方法。但是如何處理,當他們在公共方法中被調用時。假設我有以下設置:

public void method(String value){ 
    if(value.contains("something")){ 
     doSomethingToString(value); 
    } 
    else{ 
     //do something else 
    } 
} 

private void doSomethingToString(String value){ 
    Object obj = service.getObject(); //service is mocked in my test-class 
    //do something with the obj and value 
} 

我在做一個白盒測試,所以我知道方法和發生了什麼。現在我想測試公共方法method(String value)。當我現在只考慮發生在那裏的事情時,我會陷入困境,因爲我需要影響私人方法返回的service.getObject()。是否可以,當我繼續時,就像我願意的那樣,意思是使用doReturn(objectICreatedInMyTestClass).when(service.getObject())還是需要另尋方式?

2)具有多個條件的方法。例如:

public void method(String value){ 
    if(value.contains("something")){ 
     Object obj = service.getObj(value); 
    } 
    else{ 
     //do something else 
    } 

    if(obj.getAddress == null){ 
     //do something 
    } 
    else{ 
     //do something else 
     } 

    if (obj.getName == "Name") { 
     // do something 
    } 
    else 
    { 
     // do something else 
    } 
} 

需要多少次測試此方法?只有兩次,一旦所有條件都恢復正常,其次,它們都返回錯誤?還是建議測試每種可能的情況?這意味着條件1 =真,條件2 =假,條件3 =假,然後條件1 =真,條件2 =真,條件3 =假等等(= 8個可能性)的測試。

+1

可能使用http://stackoverflow.com/questions/34571/how-to-test-a-class-that-has-private-methods-fields-or-inner-classes。這就是說,是的,你應該測試你的代碼的各個分支。 https://en.wikipedia.org/wiki/Code_coverage#Basic_coverage_criteria –

+0

我在那裏的問題是,他們只使用一個條件。當我在第一次測試時,例如我有value =「Stringsomething」,obj.getAddress等於null,obj.getName等於「Name」,那麼我是否有完整的分支覆蓋?我有所有的條件設置爲true。而在第二個測試中,我設置了value =「String」,obj.getAddress!= null和obj.getName(「String」),所以現在他們都覆蓋了兩個測試。但是,我仍然需要覆蓋所有其他可能性嗎? – user5417542

回答

1

1)我應該自己測試私有方法,除了調用它們的公共方法之外嗎?

通常我會一直遵循如下假設:如果您的代碼訪問該方法的唯一方法是通過另一個方法,那麼應該如何測試它。我對測試系統的經驗使我相信,這通常是在'真實世界'中完成的方式。

如果我們以您爲例,我們可以假設我們的第一步是編寫測試來徹底測試我們的主要方法。作爲其中的一部分,我們應該測試場景,包括正確運用我們所期望的所有條件。這將包括您的私有方法將面臨的至少一部分場景。

您的私有方法可能被多個(可能是非常不同的)方法使用,因此其可能的輸入和輸出的空間可能會大於使用它的任何單個公共方法。但是,如果您徹底測試了使用它們的公共方法,那麼您應該處於測試該私有方法將遇到的所有可能場景的情況。

因此,您不應該專門爲私有方法編寫測試。在嘗試和測試私有方法或私有類時,可能還有其他一些情況是不可避免的。通常我會認爲這是因爲代碼的編寫方式很難/不可能,並且可以重寫代碼以使其對測試更友善(因此稍後更新/重構更友好)。

2)是否應該測試所有這些組合?

這取決於示例中發生的情況。有兩種不同的情況需要考慮:

a)這些分支都沒有任何關係。也就是說,第一組分支發生的事情將無法影響第二分支發生的邏輯。

b)在第一組分支中運行任何邏輯的一些可能的影響會導致在一個或多個第二分支中的代碼邏輯中產生不同的結果。

這將歸結於您的閱讀和理解代碼中發生了什麼,所以您的示例不足以指出某種做法或其他方式。

+0

非常感謝。要點2):在我的情況下,這些分支之間沒有依賴關係。所以第一個條件不會影響第二個條件等等。 – user5417542

+0

在這種情況下,您可能沒有測試所有這些不同的組合。還有一點需要記住的是,您通常需要儘可能多的代碼覆蓋率,但是100%的代碼覆蓋率並不意味着您正在測試單元測試所需的所有內容。 – Seb

+0

你說theres在分支沒有依賴關係,但是你提供/至少有一個依賴關係的例子 - 第一個分支是獲取後續分支中使用的對象 – tddmonkey