2016-10-18 7 views
0

を呼び出し、ここでセットアップのパブリックメソッドへ:どのようにユニットテストをプライベートメソッドを呼び出し、それが今度は、Webサービスメソッド

public class ClassToTest{ 

    public void doSomething(ObjectToWorkOn[] objects){ 
     doPrivateStuff(objects); 
    } 

    private void doPrivateStuff(ObjectToWorkOn[] objects){ 
     List<ObjectToWorkOn> validObjects=new ArrayList<ObjectToWorkOn>(); 
     for(ObjectToWorkOn obj:objects){ 
      if(obj.isValid()) 
      validObjects.add(obj); 
     } 
     SomeWebService ws=new SomeWebService(); 
     ws.processObjects(validObjects); 
    } 

} 

私はinvalidObjectsがフィルタリングされているかどうかを確認するために、公共doSomethingメソッドをテストする必要があります。あなたが見る通り、objectsを秘密のdoPrivateStuffメソッドに渡します。そのメソッドは無効なオブジェクトをフィルタリングし、有効なオブジェクトをWebサービスメソッドに送信します。そのWebサービスメソッドは何も返しません。だから私は有効なオブジェクトだけがWebサービスメソッドに送られたかどうかについての手がかりがありません。このケースをテストできるように私は何を提案しますか?私はオブジェクトをモックするためにMockitoフレームワークを使用しています。

+0

で呼び出されたことを確認することができますその中で何か他のことをしています(パラメータの検証など)。何かあれば、それは統合テストでしょう。 本当にユニットテストが必要な場合は、doPrivateStuff()関数をオーバーライドし、パススルーが発生することを確認してください。 – nixkuroi

答えて

2

このメソッドをテストできない主な理由は、クラス内にSomeWebServiceを作成したためです。

これを解決するには、injectSomeWebServiceとする必要があります。

public class ClassToTest{ 
    private readonly ISomeWebService someWebService; 

    public ClassToTest(ISomeWebService someWebService) 
    { 
     this.someWebService = someWebService; 
    } 

    public void doSomething(ObjectToWorkOn[] objects){ 
     doPrivateStuff(objects); 
    } 

    private void doPrivateStuff(ObjectToWorkOn[] objects){ 
     List<ObjectToWorkOn> validObjects=new ArrayList<ObjectToWorkOn>(); 
     for(ObjectToWorkOn obj:objects){ 
      if(obj.isValid()) 
      validObjects.add(obj); 
     } 

     someWebService.processObjects(validObjects); 
    } 
} 

今、あなたがテストであなたのISomeWebService依存関係を模擬し、processObjects方法は、通常あなたはユニットテストに使用する場合を除き、他の方法のために通過された方法を必要としない右引数

+0

はい、ドミトリー、本当に重要なポイントでした。洞察に感謝します。 –

関連する問題