- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试验证并捕获 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
但无济于事。
我只能想到创建一个带有辅助方法的新类来返回userName
、selectStatement
等,并验证它们是否被调用,但感觉没有必要,而且会添加只是为了提供可测试性。
最佳答案
lambda 表达式是 findOne 方法实现的一部分。因此,您应该将其作为测试 findOne 的一部分进行测试。但在调用 findOne 时它不会被执行。因此,为了能够测试它,执行 findOne 并对其进行验证和断言是不够的。
我会模拟 jdbi,然后使用捕获 lambda 函数的 ArgumentCaptor 对调用进行验证。然后,您可以将该 lambda 函数作为参数传递给测试该 lambda 函数的测试方法。该方法看起来与任何其他测试方法相同,只是它永远不能作为单独的测试用例运行。
在这种情况下,我认为一种这样的测试方法就足够了。但有时在测试 lambda 函数时,您可能需要创建并调用多个测试方法,以使用不同的输入值来测试捕获的 lambda 函数。
关于java - 使用 Mockito 验证 lambda 上的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60265003/
我一直面临一个奇怪的问题。基本上,当我正常运行 Mockito 测试时,即“作为 Junit 测试运行”时,它给了我以下错误。有人可以帮助我请问我的错误是什么? 收到的错误: java.lan
我正在使用 Mockito 以及 mockito-inline用于模拟静态方法。我正在尝试申请 doNothing或类似的行为,到静态 void 方法。以下解决方法有效,但我认为应该有一种更方便的方法
我正在尝试验证我正在测试的类是否调用了正确的依赖类的方法。所以我试图匹配方法参数,但我并不真正关心这个测试中的实际值,因为我不想让我的测试变得脆弱。 但是,我在设置它时遇到了麻烦,因为 Mockito
我正在使用 Mockito 编写单元测试,并且在模拟注入(inject)的类时遇到问题。问题是两个注入(inject)的类是相同的类型,仅通过它们的 @Qualifier 注释进行区分。如果我尝试简单
在我的断言中的以下简单练习中,我期望 1,但得到 0。为什么我会看到这种行为? public class MockitoTest { POJO mockedPojo; @Before
我正在创建一个通用模拟客户端来测试 HTTP 交互。为此,我希望能够以相同的方法进行多次响应。使用普通模拟,这不是问题: when(mock.execute(any(), any(), any()))
我需要全局模拟类方法。 我的意思是,我不能创建模拟对象和 stub 方法。我的 api 不将此对象作为参数,所以我不能在函数调用中传递它,但是这个类的对象是在这些函数中创建并在那里使用的。这就是为什么
我正在尝试使用 Mockito 2.18.3 框架模拟我们公司内部库中提供的 final 类,不幸的是我们无权更改库中的代码。但每当我运行时,我都会收到以下错误: java.lang.NoClassD
研究了mockito测试框架,学习了powermock,突然发现一个叫powermockito的框架,看不懂了。 谁能告诉我这三个测试工具的区别? 最佳答案 Mockito 是市场标准模拟框架,味道非
我想跳过检查验证调用中的参数之一。因此对于: def allowMockitoVerify=Mockito.verify(msg,atLeastOnce()).handle(1st param,,3r
为了模拟在被测方法内部构造的本地对象上的局部变量/方法调用,我们目前使用的是 PowerMockito 库。 我们正在尝试评估是否可以使用 mockito-inline(版本 3.7.7)来做同样的事
我在想, 如果在 @Before 方法中我正在初始化模拟对象,我不应该在 @After 中取消对它的引用吗?或者那会是多余的吗?为什么? 最佳答案 不需要,JUnit 会为每个测试方法创建一个新的测试
我想使用 Mockito 验证字符串参数是否满足两个条件: verify(mockClass).doSomething(Matchers.startsWith("prefix")); verify(m
如果我像这样创建一个模拟 when(servicesTestEnv.mockUserProfileAndPortfolioTransactionRepository.get(servicesTestE
使用 Mockito 我遇到了以下问题: Mockito.when(restOperationMock.exchange( Mockito.anyString(), M
我想知道描述中的事情是否可行以及如何去做。 我知道你可以调用原始方法然后像这样做答案: when(presenter, "myMethod").doAnswer() 但我想对它们进行不同的排序,首先执
我试图弄清楚org.mockito.AdditionalMatchers是如何工作的,但我失败了。为什么这个测试失败了? import static org.hamcrest.CoreMatchers
有人知道使用 Mockito 为 ATG 编写单元测试用例吗?我在凝视时遇到了以下讨论 - Automated unit tests for ATG development和 Using PowerM
我想知道描述中的事情是否可行以及如何去做。 我知道你可以调用原始方法然后像这样做答案: when(presenter, "myMethod").doAnswer() 但我想对它们进行不同的排序,首先执
我有以下接口(interface)CatalogVersionService,它公开了一些服务。我还有一个单元测试,它通过使用 Mockito 来模拟这个接口(interface),如下所示: Cat
我是一名优秀的程序员,十分优秀!