我目前正在测试一个方法,在该方法中,我将可运行程序执行到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()怎么样?