java - Mockito 可以验证参数是否具有某些属性/字段?

标签 java unit-testing mocking mockito

说我在 mock 这个类Foo

class Foo {
  public void doThing(Bar bar) {
    // ...
  }
}

这是条形码

class Bar {
  private int i;
  public int getI() { return i; }
  public void setI(int i) { this.i = i; }
}

我知道我可以使用 Mockito 的验证功能来查看是否使用 Bar 或任何 的特定实例在模拟上调用了 Foo#doThing(Bar) BarMockito.any(Bar.class), 但是有什么方法可以确保它被任何 Bar 调用但具有特定值对于 iBar#getI()?

我知道的都是可能的:

Foo mockedFoo = mock(Foo.class);
Bar someBar = mock(Bar.class);
...
verify(mockedFoo).doThing(someBar);
verify(mockedFoo).doThing(any(Bar.class);

我想知道的是,是否有一种方法可以验证具有特定真实情况的 Bar 是否作为参数传递。

最佳答案

Mockito 2.1.0 及更高版本的 Java 8 中,您可以将 lambda 传递给 argThat 开箱即用,这样就不需要自定义参数匹配器。对于 OP 中的示例将是:

verify(mockedFoo).doThing(argThat((Bar aBar) -> aBar.getI() == 5));

这是因为从 Mockito 2.1.0 开始,ArgumentMatcher 是一个函数式接口(interface)。

关于java - Mockito 可以验证参数是否具有某些属性/字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31993439/

相关文章:

java - 如何在 Java 中对 BigInteger 执行 'pre increment' 操作?

java - doPost 跳过response.sendRedirect()

ios - Xcode命令行测试执行问题

c# - 使用 Lambda 表达式验证方法调用 - Moq

java - 从解析的 XML 文件创建表时发生 Android 错误

unit-testing - Grails 3:在服务方法中传递输入流

java - 带有测试 application.properties 的 Junit 5

javascript - Jasmine:单元测试后恢复原型(prototype)方法

python - 如何模拟 boto3 的 StreamingBody 对象以在 Python 中使用 BytesIO 进行处理?

java - 是否可以将 JBOSS AS 7 配置为使用 log4j 而不是其自己的日志框架?