如何在Mockito中创建自定义匹配器?

时间:2016-05-13 09:09:30

标签: unit-testing mockito

我正在使用Mockito进行单元测试。 Mockito中有许多匹配器,如anyString()anyBoolean()。但是假设我有一个自定义enum喜欢

Enum LoginType.java

//LoginType.java
public enum LoginType {
    FACEBOOK,
    EMAIL,
    GOOGLE
}

在其中一个方法参数中,我需要传递LoginType的实例。如何在未明确传递LoginType.FACEBOOKLoginType.GOOGLE的情况下传递参数。像anyString()这样的东西。这个方向的任何暗示都是有用的。

1 个答案:

答案 0 :(得分:1)

对于any行为,只需在Java 8上调用Matchers.any()即可。当参数类型推断出现时。

您也可以选择在{Mockito 1.x中具有纯Matchers.any(LoginType.class)行为的any(),但会在Mockito 2.0及更高版本中提供类型检查。在任何一种情况下,传入类文字都将帮助Java获取推理所需的类型信息。

对于相关问题:

  • 如果你有泛型类型,那么类文字也不够;您需要将其指定为显式方法参数:

    Matchers.<YourContainer<YourType>>any();
    

    ...或提取到静态辅助方法,您需要这样做而不是常量或局部变量,因为Mockito matchers work via side effects

    public static LoginType anyLoginType() {
      return Matchers.any();
    }
    
  • 最后,对于可能在这里实现自定义匹配逻辑的未来读者,请查找Matchers.argThatMockitoHamcrest.argThat以将Hamcrest样式的Matcher对象调整为Mockito方法调用。