2011-12-14 73 views
4

サブクラスButtonClickerでスーパーコールをモックするソリューションを探しています。サブクラスでスーパークラス呼び出しをモック/テストできますか?

Class Click { 
     public void buttonClick() throws java.lang.Exception { /* compiled code */ }  } 

Class ButtonClicker extends Click { 
    @Override 
    public void buttonClick() throws Exception { 

     super.buttonClick(); 
    } } 
+0

ご質問の際に少し明確になりますようお願いいたします。詳細を教えてください.... –

+0

ButtonClickerの 'buttonClick'メソッドがあなたのニーズを満たしていないユースケースは考えられません - あなたのケースを説明できますか? –

答えて

5

継承を使用すると、コードのテスト容易性が低下します。継承をdelegationに置き換え、デリゲートをモックすることを検討してください。

IClickerClickerでクラスを実装インタフェースIClicker

interface IClicker { 
    void buttonClick(); 
} 

を抽出します。あなたは、サードパーティのコードを使用して作業している場合は、次のようにあなたのButtonClickerを書き換え

Adapter Pattern

の使用を検討してください。

class ButtonClicker implements IClicker { 
    Clicker delegate; 

    ButtonClicker(Clicker delegate) { 
     this.delegate = delegate; 
    } 

    @Override 
    public void buttonClick() throws Exception { 
     delegate.buttonClick(); 
    } 

} 

今だけコンストラクタのパラメータとしてモックを渡します

Clicker mock = Mockito.mock(Clicker.class); 
// stubbing here 
ButtonClicker buttonClicker = new ButtonClicker(mock); 
+0

コードを書き留めていただきありがとうございます。これはテストカバーしようとしているレガシーコードですが、現在はリファクタリングを検討中ですが、さらに多くの質問があります。 1.クラスクリックはサードパーティ製のコードです。なぜアダプタと委任を考慮する必要があるのか​​説明してください。私は委任でさえ参照して、私はインターフェイスを実装するクラスButtonClickerを変更する必要があります。 2. ButtonClickerは実際にはUIから直接呼び出されるアクションBean(継ぎ目コンポーネント)ですが、ボタンClickのメソッドを呼び出すためにデリゲートのButtonClickerコンストラクターが呼び出される方法と時間はどうですか? –

+0

ButtonClickerをClickerとして使用しない場合は、インターフェイスIClicker –

3

答えいいえ。モックは些細なインターフェースの実装にすぎません。つまり、どのクラスが実際に機能を実装しているか(基本的には機能性がない)といった実装の詳細についてはわかりません。

「スパイ」を実際のオブジェクトに作成すると、いくつかのメソッドだけをモックすることができますが、他のメソッドはモックできませんが、選択したメソッド典型的には署名によって選択され、これはサブクラスとスーパークラスの両方で同じである。

+0

の抽出をスキップできます。 'ButtonClicker spy = Mockito.spy(new ButtonClicker()); Mockito.doNothing()。((Clicker)spy).buttonClick(); spy.buttonClick(); 'このdintを使っても、スーパーメソッド呼び出しを欺くことができます。 –

関連する問題