如何验证以Lambda为参数的ThreadPool执行方法



我目前正在测试一个方法,在该方法中,我将可运行程序执行到ThreadPool中。

这是该方法的代码。

@Override
public void queueLogin(Connection connection, LoginPacket packet) {
    if(isRunning)
        loginPool.execute(() -> loginService.tryLogin(connection, packet));
}

现在,我需要验证execute方法是否被调用了正确的参数。

这是我的测试用例

@Test
public void theQueueLoginShouldCallExecuteOnThreadPoolIfManagerIsRunning() {
    //Arrange
    loginManager.start();
    //Act
    loginManager.queueLogin(moqConnection, moqLoginPacket);
    //Assert
    verify(moqLoginPool).execute(() -> moqLoginService.tryLogin(moqConnection, moqLoginPacket));
}

但测试失败了,说

Argument(s) are different! Wanted:
executorService.execute(
    com.battletanks.game.server.unittests.manager.login.LoginManagerTests$$Lambda$2/1668016508@3d51f06e
);
-> at com.battletanks.game.server.unittests.manager.login.LoginManagerTests.theQueueLoginShouldCallExecuteOnThreadPoolIfManagerIsNotRunning(LoginManagerTests.java:84)
Actual invocation has different arguments:
executorService.execute(
    com.battletanks.game.server.manager.login.DefaultLoginManager$$Lambda$1/77269878@7ed7259e
);

我知道这里出了什么问题,但我不知道如何解决。

按照您的方式,您依赖于这两个lambda彼此相等。因为它们没有被重写的equals方法,并且不是同一个实例,所以无法通过这种方式进行验证。

相反,捕获参数,运行它,并查看它是否执行了您希望它执行的操作。

ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.for(Runnable.class);
verify(moqLoginPool).execute(runnableCaptor.capture());
verify(moqLoginService, never()).tryLogin(any(), any());
runnableCaptor.getValue().run();
verify(moqLoginService).tryLogin(any(), any());

验证是否使用任何参数调用了moqLoginPool).execute(),然后确保在执行完成后使用moqConnection、moqLoginPack调用moqLoginService.tryLogin()怎么样?

相关内容

  • 没有找到相关文章