java - 工厂的 Mockito 条件验证

标签 java unit-testing mockito

在 mockito 中是否可以根据 mock 是否实际在被测单元中使用来验证在 mock 上调用了一个方法?

举个简单的例子,我为我的被测单元提供了一个模拟工厂 (FooFactory),当调用 Foo.create() 时,它返回一个模拟 (Foo) 以供单元中的某些方法使用-测试中。如何验证仅当 Foo.create() 被测试单元调用时才调用 Foo.method()?

我设想代码看起来像这样:

@Before
public void init() {
  Foo mockFoo = mock(Foo.class);
  when(fooFactory.create()).thenReturn(mockFoo);
  test = new UnitUnderTest(fooFactory);
}

@Test
... may or may not create a foo ...

@After
public void cleanup() {
  if (verify(fooFactory).create()) {  // Here's the 'conditional verification'
    Foo mockFoo = fooFactory.create();
    verify(mockFoo).close();
  }
}

再举一个更具体的例子,我的工厂返回一个我想确保关闭的 Reader 对象,但并不是类中的每个方法实际上都构造了一个 Reader。显然,我可以将验证添加到我知道需要 Reader 的每个测试中,但这似乎是很多重复的工作。

最佳答案

您确定要编写此测试吗?

我可以看到两种解决方案:

1) 你真的想确保资源被创建和关闭,所以尝试编写一个测试,你可以在其中验证这两个方法调用。

2) 您要确保无论何时资源被打开,它也被关闭。这可以作为生产代码中的断言来实现...

如果您真的想继续使用您的方法,您可以捕获第一个验证在尚未调用 create() 方法时抛出的异常。在捕获中你只是返回。

此外,您不应该在清理中进行验证,而应在实际测试方法中进行验证。

关于java - 工厂的 Mockito 条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4402334/

相关文章:

java - 使用 mockito 捕获方法引用

android - 如何为 Kotlin 和 Android 设置 Mockito

java - 如何使用 Mockito 模拟被调用两次且第二个方法调用的参数是第一个方法调用的输出的方法

java - 如何在 hibernate 查询语言中按没有时间戳的日期分组?

java - 如何在 Android 上添加音效?

python:在单元测试中测试特定功能?

c# - 我应该如何检查工厂在单元测试中创建的对象图

java - 如何解决 Hibernate 元模型类的问题 将 Sonar 提出的 "public static id"字段设为 Final

java - 为什么建立 JDBC 连接会卡住 UI 线程?

c# - 找不到 IdentityServer4 测试服务器