3

一般的なコンセンサス

複雑なクラスとプライベートメソッドのテストについては、かなり多くのことを読みました。

一般的なコンセンサスは次のようです。

  • 「プライベートメソッドをテストする必要がある場合は、クラスの設計が不適切です」
  • 「クラスが複雑な場合は、それを分離する必要があります」

だから、私はあなたの助けが必要です。

問題のあるクラス

だから私は比較的単純なクラスを持っており、その長期的な仕事は次のとおりです。

  • データソースをポーリングする
  • データの非常に単純なマッピングを行う
  • そのデータを別の場所に送信します

さらに:

  • 特定のエラーが発生した場合にさまざまなタスクを再試行できるようにすることで、フォールトトレラントに対応できる必要があります。

テストの問題

このクラスのポイントは、フォールトトレランスとスレッド化の多くを抽象化することです...基本的には、単純なタイマークラスといくつかの内部リストを使用してエラーなどを追跡します。

タイマーのため、特定のメソッドは異なるスレッドで非同期に呼び出されます...さらに、多くのメソッドはグローバルプライベートフィールドに依存しています。

このクラスをどのようにテストする必要がありますか...特に非常に多くのメソッドがプライベートであるためですか?

みんな乾杯

4

2 に答える 2

4

コードを抽出して、モック可能な別のクラスにデータをポーリングし、同じ理由でそのデータを送信するコードも抽出します。データ マッピング コードがどれほど些細なものであるかによっては、データ マッピング コードを抽出することをお勧めします。

単体テストでは間違いなくモックタイマーを使用します。そうしないと、テストのセットアップが難しく、実行が遅くなります。コンストラクターでタイマーを渡すか、設定できるプロパティを公開できます。コンストラクターで通常のタイマーを作成し、それを単体テストから上書きすることがよくあります。

再試行ロジックを抽出して、他のコードとは別にテストできるようにすることもできます。コードのデリゲートを渡して試行および再試行することは、データ コードを再試行ロジックから分離する方法である可能性があります。IEnumerableまた、yieldステートメントを使用してデータを生成し、再試行コードにフィードすることもできます。基本的に、再試行コードが、再試行するはずのターゲット コードを直接呼び出さないようにする方法を探しています。これにより、可能性のあるすべてのエラーのテストと生成が容易になりますが、そのターゲット コードをモック アウトするだけで同じ利点がいくつか得られます。

実際にテストする必要があるマルチスレッド シナリオがある場合は、テスト内からスレッドを調整するためのツールがいくつかあります。それらの 1 つは、私が作成したJava MultithreadedTCのポートで、 TickingTestと呼ばれます。

于 2010-10-27T17:33:16.473 に答える
1

JMockのようなものを試してみてください。これにより、実際のタイマーを制御可能なモック タイマーに置き換えることができます。次に、定義された順序でメソッド呼び出しを実行するテスト ケースを設定できます。また、モック データ ソースを作成してエラー条件を設定することもできます。

編集:おっと!C# タグが表示されませんでした。JMock に相当する C# があるかもしれません。

于 2010-10-26T23:04:37.013 に答える