334 votes

Utiliser Mockito pour simuler des classes avec des paramètres génériques

Existe-t-il une méthode propre pour se moquer d’une classe avec des paramètres génériques? Disons que je dois me moquer d'une classe Foo<T> que je dois passer à une méthode qui attend un Foo<Bar> . Je peux facilement faire ce qui suit:

 Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
 

En supposant que getValue() renvoie le type générique T . Mais cela va avoir des chatons quand je le transmettrai plus tard à une méthode qui attend Foo<Bar> . Est-ce que lancer est le seul moyen de le faire?

319voto

John Paulett Points 9021

Je pense que vous avez besoin de le lancer, mais ça ne devrait pas être trop mal:

 Foo<Bar> mockFoo = (Foo<Bar>) mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
 

305voto

Marek Kirejczyk Points 1313

Une autre solution consiste à utiliser plutôt l'annotation @Mock . Ne fonctionne pas dans tous les cas, mais semble beaucoup plus sexy :)

Voici un exemple:

 @RunWith(MockitoJUnitRunner.class)
public class FooTests {

    @Mock
    public Foo<Bar> fooMock;

    @Test
    public void testFoo() {
        when(fooMock.getValue()).thenReturn(new Bar());
    }
}
 

Le MockitoJUnitRunner initialise les champs annotés avec @Mock .

52voto

dsingleton Points 190

Vous pouvez toujours créer une classe intermédiaire/interface qui puisse satisfaire le type générique que vous êtes désireux de le préciser. Par exemple, si Toto a une interface, vous pouvez créer l'interface suivante dans votre classe de test.

private interface FooBar implements Foo<Bar>
{
}

Dans les situations où Foo est un non définitif de la classe, vous pouvez simplement étendre la classe avec le code suivant et de faire la même chose:

public class FooBar extends Foo<Bar>
{
}

Ensuite, vous pouvez consommer soit les exemples ci-dessus avec le code suivant:

Foo<Bar> mockFoo = mock(FooBar.class);
when(mockFoo.getValue()).thenReturn(new Bar());

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