0

単体テスト:

私は次のクラスを持っています

public class BImpl extends AImpl
{
    public BImpl(final C c) 
    {
        super(c);
    }

    public String getInfo()
    {
       final String info = getInformation();
       // Do all my logic here
       return info;
    }
}

public abstract class AImpl
{
    public String getInformation()
    {
    // some logic...returns String.
    }
}

Mockito または JMock のいずれかで利用可能なモック メソッドのいずれかを使用して、メソッド getInfo() を単体テストしようとしています。

たとえば、Mockito を使用する場合、次のように使用しています。

final AImpl aImpl = mock(AImpl.class);
when(aImpl.getInformation()).thenReturn("ABC");

BImpl のインスタンスを作成する必要があるため、作成できる唯一の方法は、利用可能なコンストラクターを使用することです。

final BImpl bImpl = new BImpl (C);
bImpl.getInfo();

getInfo() メソッドを呼び出して getInformation() を呼び出そうとすると、モック オブジェクトを呼び出すのではなく、実際のオブジェクトを呼び出します。

この方法をテストする良い方法は何ですか。上記のコンストラクターを使用せずに BImpl のインスタンスを作成できる他の方法はありますか?

ありがとう!!

4

1 に答える 1

2

私見では、ライブラリをモックすることの問題ではなく、デザインの問題です。依存するgetInfo()メソッドをモックしてテストしたい。getInformation()すべての依存関係をモックするメソッドの単体テストは正しい方法であり、すべてのモック フレームワークはそれをかなりうまくサポートしています。では、なぜこれらの問題が発生するのでしょうか。

構成が実際に必要な場所で継承を選択したためです。継承を悪用してuses関係を実装していますが、それは合成である必要があります。メソッドに簡単にアクセスできるようにするためだけにクラスを継承すると、問題が発生します。EntityManagerすべてのリポジトリ/DAO ごとに拡張することを考えてください...

最初にコードをリファクタリングしBImpl AImpl、後者が何らかの方法で挿入されるようにする必要があります。次に、単体テストでモックを注入しながら、実際の実装を使用して、一部の DI フレームワークに本番コードで注入を実行させる (または自分で実行させる) ことができます。

于 2011-05-27T21:34:17.257 に答える