5

クラスを単体テストしたいのですが、メソッドClass Aを使用する別のクラスに依存しています。user session私がテストしたい方法は、user session. Class A必要なメソッドの動作を複製するヘルパー メソッドを作成できますClass Bか?

明確ではないことはわかっています。明確な理解を得るためにコードを掘り下げてみましょう....

public void testDetails() throws Exception
{
    //Some logic that generates DetailsTOList
    saveDetailsHelper(DetailsTOList);
    int detailsSize = getDetailsSize();
    assertNotNull(detailsSize);
}

getDetailsSize()データベースからサイズ情報を取得します。Class Bはこのメソッドを持っていますが、ユーザーからセッション情報を取得するため、このメソッドのオブジェクトを作成してClass BテストすることはできずClass B、JUnit クラスからセッション情報を設定できます。

saveDetailsHelperメソッドの動作を複製するメソッドを作成し、上記のようClass B - saveDetails()にメソッドで呼び出しています。testDetails()

私の質問:

  1. でヘルパー メソッドを使用できjunit classますか?
  2. この状況に対処するための最善のアプローチは何ですか?
4

3 に答える 3

3

JUnit クラスは、Java の他のすべてのクラスと同じように機能します。ヘルパー関数があれば大歓迎です。他の関数が実行されるかどうかを決定する唯一のことは、(junit のバージョンに応じて) テストとして実行するようにハーネスに指示する注釈があるかどうかです。

ただし、この問題こそが、クラスを慎重に設計する必要がある理由です。Class B情報を求めてデータベースを呼び出す場合、これはその機能を区分化する絶好の機会です。「依存関係」を明確にしませんが (拡張していますか?)、 がClass Bクラス A のコンポーネントである場合、 の代用であるスタブ クラス全体を作成し、特にハードコードされたClass B(またはコード化された) データを返すことができますクラス A のテスト。Class Bプロキシの署名が同じである限り、クラス A が機能することを確信できます。

ワークスペースが乱雑にならないように、テスト クラスのこれらの内部クラスを作成すると便利なことがよくあります。

public class testA {

  @Test
  public void testDetails {
    ClassA a = new ClassA();
    a.setDependency(new StubClassB());
    //run your test
  }


  private class StubClassB() extends ClassB {
    public boolean saveDetails() {
      //return fake information;
    }
  }
}
于 2012-06-05T18:26:20.930 に答える
1

ヘルパー メソッドには @Testcase アノテーションがありません。他のコードと同じようにテスト コードを記述しますが、テストに関連するメソッドのみを含め、そのテスト メソッドの関連部分のみを検証します。

于 2012-06-05T18:18:41.250 に答える
1

ヘルパー メソッドをテスト クラスに配置し、Testcase アノテーションを省略して、必要な場所で呼び出すことができます (メソッドごとにアドホックに、またはすべてのテストで必要な場合はセットアップで)。しかし、おそらくより良い解決策は、JMock のようなものを使用してクラス B を表し、望ましい結果を返すことです。

于 2012-06-05T18:28:25.170 に答える