2017-04-06 9 views
1

パブリックメソッドが2つあり、メソッドが同じクラスの別のパブリックメソッドを呼び出すときにメソッドをテストする方法は何ですか?2つのパブリックメソッドが存在する場合、1つは別のメソッドを呼び出す場合に、単体テストを行う方法は?

このシナリオでユニットテストを作成するにはどうすればよいですか?


class SpecificIntMath { 
    public int add(int a,int b) { 
     return a+b; 
    } 
    public int multiply(int a, int b) { 
     int mul = 0; 
     for(int i = 0;i<b,i++) { 
      mul=add(a,mul); 
     } 
     return mul; 
    } 
} 

この例では、関係する方法が、概念の両方の複雑さを示していません。

addmultiplyを別々にテストする必要がありますか? multiplyのみをテストする必要がある場合は、multipleがパラメータを提供できない場合があります。

multiplyaddを別々にテストするとすれば、私はaddを模擬できるはずですか?そんなことがあるものか?

multiplyaddを個別にテストすると、私はモックすべきでないと仮定すると、私はそれがあるとしてaddが実行できます。この場合、プログラムの流れをどのように扱うべきですか?add

このような状況をテストする方法は何ですか。以下のコードで

likedDeck()のテスト中

class MCVC { 
    public boolean getWhereFrom(List<User> users) { 
     boolean allDone = true; 
     for(User user: users){ 
      String url = user.getUrl(); 
      switch(url) { 
       case Consts.GOOGLE: 
        someDao.updateFromAddr(user); 
        user.setEntry("Search Engine"); 
        break; 
       case Consts.FACEBOOK: 
        someDao.updateFromAddr(user); 
        user.setEntry("Social Media"); 
        break; 
       case Consts.HOME: 
        someDao.updateToAddr(user); 
        user.setEntry("Company"); 
       default 
        user.setEntry(null); 
        allDone = false; 
        break; 
      } 
     } 
     return allDone; 
    } 

    public void likedDeck() { 
     List<Users> usersList = deckDao.getPotentialUsers(345L,HttpStatus.OK); 
     boolean flag = getWhereFrom(usersList); 

     if(flag) { 
      for(User user: usersList) { 
       //some Action 
      } 
     } 
    } 
} 

私はgetWhereFrom()を検討すべきか、私は任意のデフォルトの状況を想定する必要があります。編集1


?デフォルトの状況を考えると、アウトプットがデフォルトではない場合には失われます。呼び出し中のクラスがテストされているので、私はそれを嘲笑すべきかどうかはわかりません。 Spying/Mocking class under test

+1

別々にテストしてください。 'multiply'をテストするときに' add'をモックしようとしません。 'multiply'が' add'を呼び出すかどうか知りません(atleastはテストを書くときに知っているとは思わない)。 – john16384

+0

また、b <0 –

答えて

2

あなたは気にしません。

パブリックメソッドを単独でテストするためにユニットテストを使用します。したがって、add()multiply()の両方が実行されることを確認するテストを作成します。

内部で相手を使用しているということは、外部には関心がありません。テストでは、この内部実装の詳細を知らないでください。

ちょうど記録のため:あなたのコードが今書かれているように。あなたは絶対にを模倣しないでくださいここに。ここでの嘲笑は必要ありません。 を追加すると、実際の生産コードとは何かはありません。とテストするリスクがあります。 は、テストを有効にするためにオブジェクトのアスペクトを制御する必要がある場合に、モックを使用します。しかし、あなたのサンプルコードの中には、テストのために模擬が必要なものはありません。もしそうなら、それは設計/実装の貧弱さを示しているでしょう(それらの方法の契約があれば)!

編集;問題の変化の例与えられたすべての

まず、getWhereFrom()バグがある - あなたはリストを繰り返します。そのリストの戻り値を上書きし続けます。したがって、最初の反復で結果がfalseに設定されると、その情報は次のループで失われる可能性があります。

私は、実際の質問には2つのオプションを参照してください。あなたはMockitoに向ける

  • を。そしてその「スパイ」概念は部分的な嘲笑を行う。あなたのソースコードをそのまま使用したい場合は
  • 私は個人的に、私はむしろ生産コードの改善に時間を費やすことになります。それは価値がある可能性がgetWhereFrom()ように私に見えるその私はおそらくそれがユーザーのリストに動作していないでしょう自身クラス(;ちょうどユーザー、また、単一のブール値を返すのに役立ちます;-) 。そして、そうするとき、依存関係注入を使用して、その "WhereFromService"クラスの(模擬した)インスタンスを取得できます。

言い換えれば、表示しているコードを再加工/リファクタリングすることができます。例えば、SRPにもっと明確に従ってください。しかし、それはもちろん大きな仕事です。あなたの周りの人々と話し合わなければならないこと。

+0

のときに乗算が壊れていることにも注意してください。別々にテストすると、 'multiply'の中でどのようにデータを操作しますか?[私の場合は' Dao'を擬似する必要があります。 'add'の内部構造ですか? –

+0

私はモックを押すためにDIを使いました。問題は、Daoの出力がリストであり、 '' add' "メソッドがある状態に影響する' 'switch-case''と' 'Dao''を持っていて、引数をテストしなければならないということです。すべてのモックは依存性が注入されます。 –

+0

バグをクリアしました。 –

0

少なくとも両者を別々にテストします。乗算テストで暗黙的に加算をテストすることは問題ありません。このような場合は、両方の方法を公開する必要があるかどうかを質問する必要があります。

0

別々に追加して乗算する必要がありますか?

ユニットテストを行っている場合は、別々にテストする必要があります。コンポーネントまたは統合テストを実行する場合にのみ、それらを一緒にテストしたいと思うでしょう。

別々にテストするために乗算して加算すると仮定すると、 モック追加できるはずですか?

yesが

どうということは可能ですか?

は、mockitoまたは他のモックフレームワークを使用します。正確にあなたがここにUse Mockito to mock some methods but not others

は乗算と仮定見ると個別にテストされ、私は モックいけないことを追加することができますどのように、私はそれがあるとして実行する追加してみましょう必要があります。

私はそれをしません。 addの内部的な変更は、複数のテストに影響を及ぼし、テストがより複雑で不安定になる可能性があります。

関連する問題