如何使用回调测试功能?

man*_*eak 4 java junit

假设我们有一个用于回调函数的接口,例如:

public interface Callback
{
    void foo();
}
Run Code Online (Sandbox Code Playgroud)

我们有一个方法可以调用作为参数给出的回调:

public void doSomething(final Callback callback)
{
    // Do something, like asynchronously fetch something from a server
    asyncStuff.doSomethingAsync(new AsyncResponseHandler()
    {
        @Override
        public void asyncStuffDone()
        {
            // Call the callback
            callback.foo();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在,问题来了:在这种情况下,如何测试回调确实被调用?

Dav*_*vid 5

Callback为测试提供一个模拟对象,并验证该方法已被调用。例如,使用Mockito作为模拟库,您将创建一个模拟对象(安排):

Callback myMock = mock(Callback.class);
Run Code Online (Sandbox Code Playgroud)

然后将其提供给要测试的代码(操作):

someObject.doSomething(myMock);
Run Code Online (Sandbox Code Playgroud)

并验证该方法已被调用(断言):

verify(myMock, times(1)).foo();
Run Code Online (Sandbox Code Playgroud)

  • 我建议不要在单元测试中使用并发,因为理想情况下,它们不应依赖于并发。您应检查无并发性的正确性,或对测试使用同步实现。无论如何,您可以使用workingThread.join()等待异步操作完成后再检查回调。 (2认同)