0

のインスタンスを引数としてThread受け入れるコンストラクターを使用してを作成するブラック ボックス クラスがあります。Runnable

public class Service {

  public static Task implements Runnable {

    @Override
    public void run() {

      doSomeHeavyProcessing();
    }
  }

  public void doAsynchronously() {

    new Thread(new Task()).start();
  }
}

Taskコンストラクター呼び出しをインターセプトし、渡された実装への参照を取得したいと考えていますRunnable。これまでのコードは次のとおりです。

@RunWith(PowerMockRunner.class)
@PrepareForTest(Service.class)
public class ServiceTest {

  @Test
  public void testService() {

    ArgumentCaptor<Runnable> runnables = ArgumentCaptor.forClass(Runnable.class);
    Thread thread = Mockito.mock(Trhead.class);
    whenNew(Thread.class.getContructor(Runnable.class)).
      withArguments(runnables.capture)).thenReturn(thread);

    new Service().doAsynchronously();

    System.out.println("all runnables: " + runnables.getAllValues());

    for (Runnable r : runnables.getAllValues()) r.run();

    // perform some assertions after the code meant to be executed in a new
    // thread has been executed in the current (main) thread
  }
}

テストを実行すると、次のように出力されます。

all runnables: []

コンストラクターによって返されたすべてのRunnableオブジェクトまたはオブジェクトへの参照を取得する方法はありますか? Thread現在の (メイン) スレッドで非同期コードを実行するか、作成されたスレッドに参加してアサーションを実行したいと考えています。

4

1 に答える 1

1

最初にコードにタイプミスがあり、一度修正すると IDE で試しても機能しませんでした。VerifyErrorコードは初期化についてスローしTaskます。作りは助かりTask publicました。

すべて問題がなければ、コードは期待どおりに機能し、ランナブルがキャプチャされたことを意味します。

代わりに、このスタブ構文を使用しますが:

whenNew(Thread.class).withParameterTypes(Runnable.class)
    .withArguments(runnables.capture()).thenReturn(mock);

実際のコードを調査して、正しくスタブ化されているかどうかを確認する必要があります。

于 2011-10-13T15:19:47.033 に答える