Mockito允许不同的参数类型来模拟重载方法

Chr*_*007 5 java junit unit-testing mocking mockito

对于JUnit测试,我想模拟一个重载方法.但是,无需在mockbuilder中实现多个方法.我想做这样的事情:

Mockito.when(mock.getSomeInfo(Mockito.any(ArgumentType1.class) OR Mockito.any(ArgumentType2.class), Mockito.any(ArgumentType3.class))).then(new Answer<AnswerType>() {..}
Run Code Online (Sandbox Code Playgroud)

我知道这不符合OR声明,但是在Mockito有另一种方法吗?

DTi*_*ing 2

您可以使用自定义匹配器来完成此操作。

警告:合理使用复杂的参数匹配,尤其是自定义参数匹配器,因为它会使测试的可读性降低。有时,最好为传递给模拟的参数实现 equals() (Mockito 自然使用 equals() 进行参数匹配)。这可以使测试更加干净。


public class TypeOrMatcher extends ArgumentMatcher<Object> {

  private final List<Class<?>> clazzes;

  public TypeOrMatcher(Class<?>...clazzes) {
    this.clazzes = new ArrayList<Class<?>>(clazzes);
  }

  public boolean matches(Object actual) {
    if (actual == null) {
      return false;
    }
    Class<?> actualClass = actual.getClass();
    for (Class<?> clazz : clazzes) {
      if (clazz.isAssignableFrom(actualClass) {
        return true;
      }
    }
    return false;
  }
}

TypeOrMatcher isTypeOneOrTwo = new TypeOrMatcher(
    ArgumentType1.class, ArgumentType2.class); 

Some mockObj = mock(Some.class);
when(mockObj.someMethod(argThat(isTypeOneOrTwo), any(ArgumentType3.class))
    .thenReturn(true);
Run Code Online (Sandbox Code Playgroud)