147 votes

Mockito : méthodes de stub qui renvoient le type avec des caractères génériques délimités

Considérez ce code :

 public class DummyClass {
    public List<? extends Number> dummyMethod() {
        return new ArrayList<Integer>();
    }
}
 public class DummyClassTest {
    public void testMockitoWithGenerics() {
        DummyClass dummyClass = Mockito.mock(DummyClass.class);
        List<? extends Number> someList = new ArrayList<Integer>();
        Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
    }
}

Le compilateur se plaint de la ligne qui essaie de remplacer le comportement de dummyMethod() . Des pointeurs sur la façon dont on s'y prend pour les méthodes de remplacement qui renvoient un type avec des caractères génériques limités ?

34voto

millhouse Points 3445

Je suppose que vous voulez pouvoir charger someList avec certaines valeurs connues ; voici une approche qui utilise Answer<T> avec une méthode d'aide basée sur des modèles pour que tout soit sécurisé :

 @Test
public void testMockitoWithGenericsUsingAnswer()
{
    DummyClass dummyClass =  Mockito.mock(DummyClass.class);

    Answer<List<Integer>> answer = setupDummyListAnswer(77, 88, 99);
    Mockito.when(dummyClass.dummyMethod()).thenAnswer(answer);

    ...
}

private <N extends Number> Answer<List<N>> setupDummyListAnswer(N... values) {
    final List<N> someList = new ArrayList<N>();

    someList.addAll(Arrays.asList(values));

    Answer<List<N>> answer = new Answer<List<N>>() {
        public List<N> answer(InvocationOnMock invocation) throws Throwable {
            return someList;
        }   
    };
    return answer;
}

0voto

Andreas Siegel Points 321

Bien que la méthode utilitaire proposée par Marek Radonsky fonctionne, il existe également une autre option qui ne nécessite même pas l'expression lambda (à mon humble avis) suggérée par fikovnik :

Comme le montre cette réponse à une question similaire, vous pouvez également utiliser les éléments suivants :

 BDDMockito.willReturn(someList).given(dummyClass).dummyMethod();

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