2014-02-13 170 views
0
public void publicMethod() { 
     privateMethod1(); 
     privateMethod2(); 
     privateMethod3(); 
     privateMethod4(); 
    } 

    private void privateMethod4() { 
     anotherPrivateMethodOrServiceCall(); 
     // .... 
    } 

    private void privateMethod3() { 
     anotherPrivateMethodOrServiceCall(); 
     // .... 
    } 

    private void privateMethod2() { 
     anotherPrivateMethodOrServiceCall(); 
     // .... 
    } 

    private void privateMethod1() { 
     anotherPrivateMethodOrServiceCall(); 
     // .... 
    } 

私有方法不能單獨進行測試,而不會將其設置爲默認值(而且這有點難看)。 如果我從公開的方法測試它,它總是會導致一個超級大嘲弄和斷言。維護如此大的測試用例是一件痛苦的事情。處理這個問題的其他好方法或實踐?謝謝。如何單元測試調用私有方法鏈的方法?

// long list of service mocking 

@Test 
public void testPublicMethod() { 
    context.checking(new Expectations() {{ 
    // super long list of result mocking 
    }}); 
    // ... 
    // super long list of assertions 
    assertEquals(....); 
} 
+0

這通常表明您正在測試錯誤的東西。你不應該測試被調用的私有方法,你應該測試對外部服務的調用(並且這些調用應該是通過模擬服務完成的)。 –

+0

publicMethod本身是一個服務調用。它調用很多其他服務調用。 – Drogba

+0

您可以使用反射來調用測試用例中的私有方法 –

回答

1

我知道Java或專門的Java單元測試非常痘痘,所以在這裏我的觀察是純粹一般一個面對面的人單元測試一般。

  • 看起來你的班級在內部做得太多了。如果您爲什麼需要通過一次公開呼叫進行4次私人方法調用是有原因的,那麼您很可能會進入違反SRP的區域(不是該規則不是不侵權的,但它是設計的良好指示器聞)

  • 現在我們沒有對你的「外」類是做得太多背景,但由於提供的信息,也許你可以考慮,而不是重構中的每個這4種私人方法所做的工作分成4個獨立的,您可以將它們作爲依賴關係提供給您的主類;然後你改變你的測試方法有多種,小測試每一個只檢查一個特定的依賴被調用

例如,您的方法名可能看起來像

PublicMethod_InvokesService1(){} 
PublicMethod_InvokesService2(){} 
PublicMethod_InvokesService3(){} 
PublicMethod_InvokesService4(){} 

這意味着你避免所有的那些巨大的模擬/斷言鏈在一個單一的方法。

  • 你可能會認爲這是天真的,因爲 - 關於操作的順序是什麼 - 當然它變得太亂,以確保調用的順序是正確的,關於通過從方法一傳遞返回值放入方法2是什麼嘲笑等

  • 在這種情況下,如果這些服務需要按照嚴格的順序被調用,那麼也可以考慮,而不是依賴的平面列表,你真的應該使用一個層次

即代替

PublicClass depends on Service 1 (depends on Service2,3 and 4) 

你有

PublicClass depends on Service 1 (depends on Service2 (depends on Service 3 (depends on Service 4)))) 
  • 這意味着,操作的順序是N/A;每個來自公衆的服務只調用一個依賴關係,這意味着您不必擔心訂單。事實上,在編寫公共方法之前,您已經在結構上強制執行操作的邏輯順序。

只是我的2C。

相關問題