Java 如何在异步线程中测试调用的方法?

Java 如何在异步线程中测试调用的方法?,java,asynchronous,junit,mockito,powermock,Java,Asynchronous,Junit,Mockito,Powermock,我有以下课程: public class ForTest { public void methodToTest(Thread thread){ thread.start(); } } class MyThread extends Thread{ FooClass fooClass; public MyThread(FooClass fooClass){ this.fooClass = fooClass; } @Ove

我有以下课程:

public class ForTest {
    public void methodToTest(Thread thread){
        thread.start();
    }
}
class MyThread extends Thread{
    FooClass fooClass;
    public MyThread(FooClass fooClass){
        this.fooClass = fooClass;
    }
    @Override
    public void run() {
        fooClass.bar();
    }
}
class FooClass{
    public void bar(){}
}
我想测试方法
methodToTest

我想将MyThread的实例作为上述方法的参数传递

因此,我想验证是否调用了方法
bar


你能帮我用Mockito或Powermock写吗?

需要考虑的几件事:

  • 因为您使用的是外部线程,需要某种等待/阻塞
  • 如果线程代码更复杂,并且因为我们通常需要等待线程完成其执行(而不是您的情况),则有必要使用超时功能
  • 您根本不必使用mock,例如,
    FooClass.bar()
    方法可以设置/修改一个字段,然后检查该字段是否有更改的值

    @Test
    public void testSomeMethod() throws InterruptedException {
        FooClass fooClassMock = Mockito.mock(FooClass.class);
        Thread thread = new MyThread(fooClassMock);
    
        new ForTest().methodToTest(thread);
    
        thread.join();
    
        Mockito.verify(fooClassMock).bar();
    }
    

  • 我认为我不应该使用超时。这要视情况而定。在您的情况下,因为它是一个普通的代码,所以您确实不必使用
    timeout
    参数,因为线程执行会非常快。但通常,如果线程执行可能更长更复杂,则应始终使用
    @Test(timeout…
    。使用线程并不意味着应该使用超时。如果代码预期会终止,那么它与任何其他应用程序代码一样。我也不明白你为什么说“你根本不需要使用mock”,然后提供了一个使用mock的代码示例。虽然您的示例看起来不错,但在解决其他一些令人困惑的问题之前,我不会使用+1。