2

スレッドを使用するメソッドの単体テストを作成する方法。

以下の例では、someMethodメソッドをテストする方法は?

    public class SomeClass {

    private final SomeOtherClass someOtherClassInstance = IoC.getInstance(SomeOtherClass.class);

    private final ExecutorService executorService = Executors.newCachedThreadPool();

    public void someMethod() {
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                someOtherClassInstance.someOtherMethod();
            }
        });
    }
}

この目的のためにjavaと.netに解決策はありますか?

4

3 に答える 3

7

あなたの質問は、「単体テストとは」(UT)です。UT は、自動テストの 1 つの形式にすぎません。この場合、あなたの質問は、コードが OS を呼び出してスレッドを開始することを意味するため、定義上、それをテストするテストは単体テストではなく、おそらく統合テストになります。

セマンティクスのように思われることであなたを悩ませているのは、テストの意図を理解することで、テストの作成とコードの構造化が非常に簡単になるからです。動作するコードの量は、テスト可能なコードの量よりも多くなります。

では、このコードを単体テスト可能に変更するにはどうすればよいでしょうか (「なぜ面倒なのか」はスキップします) ...

C# の単体テストは、単一の型 (クラス) をテストします ... 重要なことに (定義上) 他には何もありません。したがって、コードはこれを反映する必要があります。あなたがテストしたいのは、私が ABC を呼び出すと、このようなことが行われるということです。スレッドの起動を含むもの。そのため、スレッドを起動するメソッドが呼び出されたことをテストします。ここでの基本は、アプリケーションがスレッドを必要とするため、それがあなたの主張です。

では、どうやって?スレッド作成用のプロキシと、おそらくファクトリを作成します。次に、単体テストで、それが呼び出され、どのように処理されたかをアサートできます。難しそうに見えますが、慣れると意外と簡単です。

ところで、Resharper は OS タイプ (スレッドなど) のプロキシを作成します。ヘルプで委任メンバーの内容を確認してください。Resharper を使用していない場合は、使用する必要があります。

はい、これがあなたが望んでいた答えではないことはわかっていますが、それがあなたが必要としている答えだと信じてください.

テストを次のカテゴリに分けて考えると便利です。

  • 単体テスト
  • 統合テスト (またはサブシステム テスト)
  • 機能テスト (例: UI/アプリケーション/UAT テスト)
于 2012-10-03T10:36:09.983 に答える
2

別のスレッドがある場合は、メソッドが呼び出されるまで待機する必要があります。メソッドが呼び出されなかったと見なす前に、どれくらい待つべきかを決定する必要があります。それを行うことができるツールはありません。

もちろん、 ExecutorService をモックして現在のスレッドで実行し、問題を回避できます。

于 2012-10-03T11:18:50.387 に答える