2017-12-07 1 views
0

void process()というメソッドを持つクラスSomeClassがあるとします。このメソッドの実装は、new Thread(this::someOtherMethod).startのようなsmthです(特定のスレッドではsomeOtherMethodのみを実行する必要があります)。この方法のためのユニットテスト書き留めたメソッドの実行を待って

SomeClass class= new SomeClass(anObjectToWorkWith); class.process(); assertEquals(expectedObj, anObjectToWorkWith)

を私はprocess方法は、特定のスレッドで実行されるようprocess方法が完了する前に、assertEquals命令が呼び出されることを、理解しています。

したがって、私は質問があります:メソッドの実行を待って、assertEqualsが必ずprocessの後に呼び出されるようにする方法がありますか?

ありがとうございます。

P.S. Thread.sleepメソッドまたはSomeClassRunnableインターフェイスを実装することを意味するソリューションを使用するソリューションを提案しないでください。これらのソリューションはタスクに準拠していません。

+0

class.process()を呼び出しスレッドがt.join()を呼び出すことができるスレッドtインスタンスを返すようにした場合。それはサブスレッドが終了するのを待つでしょう。 – bhspencer

+0

@bhspencerことは、SomeClassクラスが 'void process()'メソッドを使ってインタフェースを実装していることです。そのため、私はそのような解決策では制限されています。 – draft

+0

その場合、SomeClassのインスタンスにwait()という別のメソッドを追加できます。スレッドをSomeClassのメンバーにし、wait()を呼び出します。t.join(); – bhspencer

答えて

2

ハードコードは、ここでコードをテストするだけです。

テスト対象のコードで新しいスレッドインスタンスが作成され、それを使用すると、単純なはありません。合理的な単体テストを書くには良い方法です。

代わりに、テスト中のコードを変更することを検討してください。

例:低レベルのスレッドを使用する代わりに、ExecutorServiceに切り替えます。あなたのテストにはsame thread executorを使用してください。これにより、マルチスレッドの問題をシングルスレッドの問題にすることができます。別の種類のエグゼキュータを使用するだけです。

+0

これ。内部的に作成された 'Runnable'をテストして、並行処理なしで想定されている結果を作成できるようにしてください。 – daniu

関連する問題