2016-06-08 30 views
1

的私有方法裏面我有一個看起來像這樣(簡化)的方法驗證一個void方法調用了EasyMock/PowerMock

private boolean x = someMethodToSetTheValueOfX(); 

private void method(args){ 
     if(x){ 
      method1(); 
     }else{ 
      method2(); 
     } 
} 

我想編寫一個單元測試,以保證當x爲true, method1被調用。我知道我可以使用PowerMock的Whitebox設置x的值並調用方法,但是如何確認method1()被調用?請注意,method1()是無效的。

除了EasyMock/PowerMock之外,我不允許使用其他框架(如Mockito)。

+0

以防萬一:讓我知道你是否需要更多的信息來找到我的答案有幫助;否則請不要忘記接受答案;-) – GhostCat

回答

1

你是錯了;這不是你應該如何設計你的測試。

首先:請不要使用任何PowerMock ...框架。他們依靠字節碼操作;遲早會招來麻煩。相信我,我花了很多時間去尋找真正奇怪的錯誤,沒有任何理由。

然後:不要這樣測試你的代碼!

您使用模擬框架來創建/控制您傳遞給「正在測試的類」的那些對象。你不使用框架來直接測試你的「正在測試的類」!更具體地說:您不想編寫知道私有方法的測試代碼 - 那些是實現細節。

你做什麼,而不是:

一)正如所說,你可以用嘲諷的對象傳遞到你的類測試。然後你可以控制/驗證那些模擬看到你期望你的「受測試的類」所做的調用。所以,最壞的情況下,你可以把method1/2放在不同的對象上;然後你可以使用模擬/驗證來檢查它們是否按預期調用。 b)你創建你的「正在測試的類」的對象......然後對這些對象的屬性進行「斷言」;然後,或者方法調用返回的結果。

+0

也不是通過使用PowerMock你正在改變被測試的單位。所以你實際上並不是在測試你的班級,而是在生產中看不到的東西。 – SpaceTrucker

1

您可以使用:

System.out.println("method one was called"); 

如果您可以打印到康壽像日食,或使用一個IDE:

JOptionPane.showMessageDialogue(null, "method one was called"); 

,並把他們的內部方法1

+0

我想你誤解了這個問題。這是關於單元測試(如JUnit測試)。不涉及故障排除。但否則是的,我會做第一個:) – Steve

相關問題