gpt4 book ai didi

java - 使用 Mockito 验证 lambda 上的方法调用

转载 作者:行者123 更新时间:2023-12-01 18:23:46 26 4
gpt4 key购买 nike

我正在尝试验证并捕获 lambda 表达式中某些方法调用的参数,如下所示:

public Optional<UserDetails> findOne(String userName) {
String selectStatement =
"SELECT * FROM users WHERE userName = :userName;";

return jdbi.withHandle(handle -> handle
.createQuery(selectStatement)
.bind("userName", userName)
.map(new UserDetailsMapper())
.findOne());
}

jdbi.withHandle() 采用 HandleCallBack 参数,如下所示:

public interface HandleCallback<T, X extends Exception> {
T withHandle(Handle handle) throws X;
}

例如,我想验证是否已使用 "userName" 调用了 .bind() 以及传入的 userName 参数字符串来 self 的 findOne 方法。

确实感觉我是在对 Jdbi 类而不是我自己的类进行单元测试,但我感觉像 .createQuery() .bind() 的参数和 .map() 应该进行测试,因为开发人员可能会意外更改它们。

我目前采取的方法是创建一个内存数据库并测试实际返回的内容,但这感觉更像是集成测试而不是单元测试。我也不太关心 Jdbi .withHandle() 方法实际返回的内容,因为那时我本质上是在测试一个库。

我的理解是,我应该对传递给 .withHandle() 的参数(在本例中为 lambda 表达式)进行单元测试,这就是我在这里尝试做的事情。

我得到的最接近的方法是将逻辑移动到方法引用中,但这不起作用,因为 userName 被传递到我的 findOne() 方法中,然后使用在 lambda 内部。

我也尝试过 Mockito 的 doAnswer 但无济于事。

我只能想到创建一个带有辅助方法的新类来返回userNameselectStatement等,并验证它们是否被调用,但感觉没有必要,而且会添加只是为了提供可测试性。

最佳答案

lambda 表达式是 findOne 方法实现的一部分。因此,您应该将其作为测试 findOne 的一部分进行测试。但在调用 findOne 时它​​不会被执行。因此,为了能够测试它,执行 findOne 并对其进行验证和断言是不够的。

我会模拟 jdbi,然后使用捕获 lambda 函数的 ArgumentCaptor 对调用进行验证。然后,您可以将该 lambda 函数作为参数传递给测试该 lambda 函数的测试方法。该方法看起来与任何其他测试方法相同,只是它永远不能作为单独的测试用例运行。

在这种情况下,我认为一种这样的测试方法就足够了。但有时在测试 lambda 函数时,您可能需要创建并调用多个测试方法,以使用不同的输入值来测试捕获的 lambda 函数。

关于java - 使用 Mockito 验证 lambda 上的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60265003/

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