194 votes

Comment faire correspondre les varargs dans Mockito

J'essayais de me moquer d'une méthode avec des paramètres vararg en utilisant Mockito:

 interface A {
  B b(int x, int y, C... c);
}

A a = mock(A.class);
B b = mock(B.class);

when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));
 

Cela ne fonctionne pas, cependant si je le fais à la place:

 when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
 

Cela fonctionne, malgré que j’ai complètement omis l’argument varargs lors de l’arrêt de la méthode.

Des indices?

275voto

topchef Points 7473

Mockito 1.8.1 a introduit le matcher anyVararg () :

 when(a.b(anyInt(), anyInt(), anyVararg())).thenReturn(b);
 

Consultez également l'historique de cette opération: http://code.google.com/p/mockito/issues/detail?id=62.

33voto

Eli Levine Points 121

Une fonctionnalité quelque peu non documentée: si vous souhaitez développer un Matcher personnalisé qui corresponde aux arguments vararg, vous devez le faire implémenter org.mockito.internal.matchers.VarargMatcher pour qu'il fonctionne correctement. C'est une interface de marqueur vide, sans laquelle Mockito ne comparera pas correctement les arguments lors de l'appel d'une méthode avec varargs à l'aide de votre Matcher.

Par exemple:

 class MyVarargMatcher extends ArgumentMatcher<C[]> implements VarargMatcher {
    @Override public boolean matches(Object varargArgument) {
        return /* does it match? */ true;
    }
}

when(a.b(anyInt(), anyInt(), argThat(new MyVarargMatcher()))).thenReturn(b);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X