簡體   English   中英

Mockito JUnit測試:檢查構造函數中的方法調用

[英]Mockito JUnit testing: check method call in constructor

我有一個帶有私有和公共或受保護方法的Foo類。 例如:

public class Foo{

   private int number;
   public Foo(){
      setup();
      doSthing();
   }

   private void doSthing(){
      number=10;
   }

   public void setup(){
   }

   protected int getNumber(){
      return number;
   }

   public void run(){
      getNumber();
      //Do blah blah...
    }    
}

我正在嘗試使用Mockito測試此類。

public class FooTest
{
   public void testMethods()
   {
      Foo foo = PowerMockito.mock (Foo.class);

      //1 What should I do to see that setup() and doSthing()
      //has been called on Foo construction

      mock.run();
      //2 What should I do to see that getNumber()
      //has been called on run() method call
   }
}

我還希望盡可能包含“ times(1)”。 多謝您的協助。

您錯了:

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

然后:不要以這種方式測試您的代碼!

您使用模擬框架來創建/控制傳遞給“被測類”的那些對象。 您不使用該框架直接測試“被測類”!

您也不想編寫知道私有方法的測試代碼-這些是實現細節。

您要做的是:

a)如前所述,您可以使用模擬將對象傳遞到要測試的類中。 然后,您可以控制/驗證那些模擬,以查看您希望“測試中的類”進行的調用

b)創建“被測類”的對象……然后在那些對象的屬性上“斷言”; 或方法調用返回的結果。

只是要准確:一個嘲笑的對象......不知道在“原始”類的代碼什么 這是一個模擬 您不能將其用於您的問題暗示您想要做的那種測試。 您可以在真實的類中調用方法; 或者您為模擬指定內容。 但是創建一個模擬然后將其“關聯”到具體的類實現上……是完全不可能的。

最后:如果您認為您的具體類實際上“太大”而不能以正常的測試方式創建……那么機會就在於:您的類對於其他任何事情都太大了。 班級應小; 並且其設計應遵循SOLID原則。

長話短說:不要通過使用PowerMock來將無法測試的代碼強加到“測試”中。您最好花更多的時間來提高生產代碼的質量。 這將導致更高的“投資回報率”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM