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();
    } }
4

2 に答える 2

6

継承を使用すると、コードの妥当性が低下します。継承を委任に置き換えて、委任をモックすることを検討してください。

インターフェイスIClickerを抽出します

interface IClicker {
    void buttonClick();
}

クラスで実装IClickerClickerます。サードパーティのコードを使用している場合は、アダプタパターンの使用を検討してください

ButtonClicker次のように書き直してください。

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);
于 2011-12-14T15:31:02.020 に答える
3

答えはいいえだ。モックは、些細なインターフェースの実装にすぎません。(つまり、特定のJavaキーワードの意味ではなく、APIの意味でのインターフェースを意味します。)したがって、どのクラスが実際に機能を実装するかなどの実装の詳細についてはわかりません(基本的に機能はありません)。

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

于 2011-12-14T17:27:25.220 に答える