在 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/