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

时间:2015-10-30 17:18:06

标签: java unit-testing mockito

我目前正在测试一种方法,我将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
);

我明白这里有什么问题,但我不知道如何解决这个问题。

2 个答案:

答案 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()?

相关问题