我目前正在测试一种方法,我将runnable执行到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
);
我明白这里有什么问题,但我不知道如何解决这个问题。
答案 0 :(得分:3)
你拥有它的方式,你依靠这两个lambda彼此相等。因为它们没有被覆盖的equals
方法,并且不是同一个实例,所以您将无法验证这种方式。
相反,capture the argument,运行它,并看到它做了你想要它做的事。
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());
答案 1 :(得分:0)
如何使用任何参数调用moqLoginPool验证.execute(),然后确保在执行完成后使用moqConnection,moqLoginPacket调用moqLoginService.tryLogin()?