3

クラスBのオブジェクトを内部的にインスタンス化するクラスAがあります。その2番目のクラスには、ネットワーク接続を使用するなど、多くの外部副作用があります。

public class A {
  private B b;
  public A() {
    b = new B(); // 3rd party class that calls out externally (e.g. to a db)
  }
}

クラスBのモック実装を提供することでクラスAを単体テストしたいと思います。独自のクラスを作成するか、Mockitoや他のフレームワークなどを使用して、Bのモックバージョンを簡単に作成できますが、このモック実装をクラスに注入するにはどうすればよいですか。 Aのコード?

クラスAのコンストラクターでクラスBのインスタンスを要求できると思いますが、それは醜いようです。クラスAがどのようにビジネスを行っているかを実際に知る必要はありません。

Pythonには、テスト中の実行時に関数に「パッチを適用」できる「モック」ライブラリがあります。Javaには似たようなものがありますか?

4

3 に答える 3

3

このシナリオでは、通常、テスト目的でモックを渡すことができる2番目のパッケージ(デフォルト)スコープコンストラクターがあります。

public class A {
  private B b;

  /*
  *  Used by clients
  */
  public A() {
    this(new B());
  }

  /*
  * Used by unit test
  * 
  * @param b A mock implementation of B
  */
  A(B b) {
    this.b = b;
  }
}
于 2012-09-30T21:02:21.063 に答える
0

Mockitoをチェックしてください。 最終的には、設計に基づいて、リフレクションを使用してBのモックインスタンスをAに取り込む必要があります。

于 2012-09-30T21:01:42.847 に答える
0

これは、JMockitモックAPIを使用して解決するのは簡単です。

public class ATest
{
    @Test
    public void myTest(@Mocked B mockB)
    {
        // Record expectations on "mockB", if needed.

        new A().doSomethingUsingB();

        // Verify expectations on "mockB", if applicable.
    }
}
于 2013-04-26T17:58:49.937 に答える