Mockito - 是否有“值不在列表中”的匹配器?

Guy*_*mel 3 java junit unit-testing mockito

我目前有一个模拟,它具有针对特定输入集的特定行为。每个其他输入都应该返回一个特定的响应。

例如:

    Mockito.when(classInstance.myFunc(Mockito.eq("Option1"))).thenReturn(answer1);
    Mockito.when(classInstance.myFunc(Mockito.eq("Option2"))).thenReturn(answer2);
    Mockito.when(classInstance.myFunc(Mockito.eq("Option3"))).thenReturn(answer3);
    Mockito.when(classInstance.myFunc(Mockito.eq("Option4"))).thenReturn(answer4);

    // Return defaultAnswer if and(and(not("Option1"), not("Option2")), and(not("Option3"), not("Option4")))
    Mockito.when(classInstance.myFunc(AdditionalMatchers.and(AdditionalMatchers.and(AdditionalMatchers.not(Mockito.eq("Option1")), AdditionalMatchers.not(Mockito.eq("Option2")), AdditionalMatchers.and(AdditionalMatchers.not(Mockito.eq("Option3")), AdditionalMatchers.not(Mockito.eq("Option4")))).thenReturn(defaultAnswer);
Run Code Online (Sandbox Code Playgroud)

我最大的麻烦是and(and(not("Option1"), not("Option2")), and(not("Option3"), not("Option4")))线路的复杂性。

我真的希望有一种更简单的方法来指定“其他所有内容”或“不在列表中:[“option1”,...]”的条件

是否有“组内”或类似内容的匹配器?

dav*_*xxx 5

为什么不简单地使用Mockito.matches(boolean)例如:

 import static org.mockito.Mockito.*;

 Mockito.when(classInstance.myFunc(matches("Option[^1-4]"))
        .thenReturn(defaultAnswer);
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您也可以使用Mockito.argThat().
要过滤掉一些整数值(如您的评论中所建议的),您可以编写:

 import static org.mockito.Mockito.*;

 List<Integer> toNotMatchList = Arrays.asList(1, 2, 3, 4) ;
 Mockito.when(classInstance.myFunc(argThat(i -> !toNotMatchList.contains(i))
        .thenReturn(defaultAnswer);
Run Code Online (Sandbox Code Playgroud)

或者更直接:

Mockito.when(classInstance.myFunc(argThat(i -> !Arrays.asList(1, 2, 3, 4).contains(i))
        .thenReturn(defaultAnswer);
Run Code Online (Sandbox Code Playgroud)


rya*_*anp 5

您可以通过显式定义默认值来使其更具可读性,然后使用后续存根“覆盖”它:

when(classInstance.myFunc(any()).thenReturn(defaultAnswer);
when(classInstance.myFunc("Option1").thenReturn(answer1);
when(classInstance.myFunc("Option2").thenReturn(answer2);
...
Run Code Online (Sandbox Code Playgroud)

或者你可以使用 MockitoHamcrest 和 Hamcrest 的核心匹配器来简化它,例如:

when(classInstance.myFunc(argThat(is(allOf(not("Option1"), not("Option2"), ...))))
    .thenReturn(...)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 MockitoHamcrest 和您自己的 Hamcrest 匹配器。