gpt4 book ai didi

java - 如何验证以Lambda为参数的ThreadPool execute方法

转载 作者:行者123 更新时间:2023-11-30 08:07:53 25 4
gpt4 key购买 nike

我目前正在测试一种将可运行对象执行到线程池中的方法。

这是该方法的代码。

@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 方法,并且不是同一个实例,所以您将无法通过这种方式进行验证。

相反,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());

关于java - 如何验证以Lambda为参数的ThreadPool execute方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33441497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com