如何让Mockito根据枚举返回不同的值?

时间:2016-01-08 16:17:15

标签: java mockito

所以我试图模拟一个方法getPremium,它接受​​一个参数,PanicLevel的实例是enum。它需要返回一个不同的double值,具体取决于传入的PanicLevel

如果我想按照enum值执行此操作,那么这样的东西应该可以工作。

Mockito.when(mockData.getPremium(PanicLevel.NORMAL)).thenReturn(1.1);

但是每个枚举值需要一行。我宁愿做类似的事情:

Mockito.when(mockData.getPremium(anyPanicLevel())).thenReturn(premiums.get(passedInPanicLevel());

显然这不是有效的......但类似的东西应该是....

我发现了这个,但是它从某个地方使用方法anyStringmockito return value based on property of a parameter

如果不对每个密钥重复when,我如何让Mockito执行此操作?

3 个答案:

答案 0 :(得分:5)

您可以使用Answer

Mockito.when(mockData.getPremium(Matchers.any(PanicLevel.class)))
    .thenAnswer(new Answer<Double>() {
        @Override
        public Double answer(InvocationOnMock arg0) throws Throwable {
          PanelLevel panicLevel = (PanicLevel) arg0.getArguments()[0];
          return premiums.get(panicLevel);
        }        
    });

仅供参考:anyString()可能只是Matchers.anyString()

答案 1 :(得分:0)

输出取决于PanicLevel枚举值。然后我们需要模拟测试用例所需的所有值。我认为还有其他办法。您可以使用Properties(enumValue,ouput)然后迭代它们来实现此目的。

答案 2 :(得分:-1)

Mockito: How to match any enum parameter

看起来你需要使用Matchers.any(Class)

Mockito.when(mockData.getPremium(Matchers.any(PanicLevel.class)).thenReturn(premiums.get(passedInPanicLevel());