0

有一个黑盒类,它Thread使用它的构造函数创建一个接受一个实例Runnable作为参数的:

public class Service {

  public static Task implements Runnable {

    @Override
    public void run() {

      doSomeHeavyProcessing();
    }
  }

  public void doAsynchronously() {

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

我想拦截构造函数调用并获取对传递Taskimplementation的引用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 回答