是否可以配置Mockito mock以在单个调用上调用多个答案?

时间:2015-02-20 09:01:23

标签: java junit mockito

我有一个测试一组类的测试,我必须存根一个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 mock配置为在单个调用中调用多个答案?

1 个答案:

答案 0 :(得分:3)

一种简单的方法是创建一个复合答案:

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));