是否可以将 Mockito mock 配置为在一次调用中调用多个答案?
Is it possible to configure Mockito mock to call multiple answers on a single invocation?
我有一个测试一堆 类 的测试,我必须存根一个 void 方法。存根行为应始终调用一个回调,在某些情况下还应调用第二个回调,具体取决于调用参数。
这是我的测试代码,方法名称代表我想要完成的。
doAnswer(new Answer<Void>()
{
@Override
public Void answer(InvocationOnMock invocation) throws Throwable
{
callback.thisShouldBeAlwaysCalled();
return null;
}
}).when(service).foo(any(Bar.class));
doAnswer(new Answer<Void>()
{
@Override
public Void answer(InvocationOnMock invocation) throws Throwable
{
callback.thisShouldBeCalledInAdditionInSomeCases();
return null;
}
}).when(service).foo(argThat(new CustomBarMatcher(42)));
目前我必须在 answer() 主体中使用 if 语句来涵盖这些与任何 (Bar.class) 匹配器结合的用例,但是使用自定义匹配器会更容易和更清晰。
是否可以将 Mockito 模拟配置为在一次调用中调用多个答案?
一个简单的方法是创建一个复合答案:
final Answer answer1 = ...;
final Answer answer2 = ...;
Answer compositeAnswer = new Answer() {
public Void answer(InvocationOnMock invocation) throws Throwable {
answer1.answer(invocation);
answer2.answer(invocation);
return null;
}
};
可能存在为您构建此组合的实用方法。
所以要完成,请使用:
doAnswer(compositeAnswer ).when(service).foo(any(Bar.class));
我有一个测试一堆 类 的测试,我必须存根一个 void 方法。存根行为应始终调用一个回调,在某些情况下还应调用第二个回调,具体取决于调用参数。 这是我的测试代码,方法名称代表我想要完成的。
doAnswer(new Answer<Void>()
{
@Override
public Void answer(InvocationOnMock invocation) throws Throwable
{
callback.thisShouldBeAlwaysCalled();
return null;
}
}).when(service).foo(any(Bar.class));
doAnswer(new Answer<Void>()
{
@Override
public Void answer(InvocationOnMock invocation) throws Throwable
{
callback.thisShouldBeCalledInAdditionInSomeCases();
return null;
}
}).when(service).foo(argThat(new CustomBarMatcher(42)));
目前我必须在 answer() 主体中使用 if 语句来涵盖这些与任何 (Bar.class) 匹配器结合的用例,但是使用自定义匹配器会更容易和更清晰。 是否可以将 Mockito 模拟配置为在一次调用中调用多个答案?
一个简单的方法是创建一个复合答案:
final Answer answer1 = ...;
final Answer answer2 = ...;
Answer compositeAnswer = new Answer() {
public Void answer(InvocationOnMock invocation) throws Throwable {
answer1.answer(invocation);
answer2.answer(invocation);
return null;
}
};
可能存在为您构建此组合的实用方法。
所以要完成,请使用:
doAnswer(compositeAnswer ).when(service).foo(any(Bar.class));