Existe-t-il une méthode propre de 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 dans une méthode qui attend a Foo<Bar>
. Je peux faire ce qui suit assez facilement:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
En supposant que getValue()
renvoie le type générique T
. Mais ça va avoir des chatons quand je le passerai plus tard dans une méthode attendante Foo<Bar>
. Le casting est-il le seul moyen d'y parvenir?
Une autre solution consiste à utiliser à la
@Mock
place des annotations. Ne fonctionne pas dans tous les cas, mais semble beaucoup plus sexy :)Voici un exemple:
Le
MockitoJUnitRunner
initialise les champs annotés avec@Mock
.la source
SuppressWarnings
. Les avertissements existent pour une raison, il vaut mieux ne pas avoir l'habitude de les supprimer. Merci!@Mock
placemock()
: les champs sont toujours nuls pendant la construction, donc je ne peux pas insérer de dépendances à ce moment-là et ne peux pas rendre les champs définitifs. Le premier peut être résolu par une@Before
méthode annotée bien sûr.Vous pouvez toujours créer une classe / interface intermédiaire qui satisferait le type générique que vous souhaitez spécifier. Par exemple, si Foo était une interface, vous pouvez créer l'interface suivante dans votre classe de test.
Dans les situations où Foo est une classe non finale , vous pouvez simplement étendre la classe avec le code suivant et faire la même chose:
Ensuite, vous pouvez utiliser l'un des exemples ci-dessus avec le code suivant:
la source
Foo
qu'il s'agisse d'une interface ou d'une classe non finale, cela semble être une solution raisonnablement élégante. Merci.Créez une méthode utilitaire de test . Particulièrement utile si vous en avez besoin plusieurs fois.
la source
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
n'a même pas besoin d'une seule suppression :) Mais attention,Integer num = genericMock(Number.class)
compile, mais lanceClassCastException
. Ceci n'est utile que pour leG<P> mock = mock(G.class)
cas le plus courant .Je suis d'accord qu'il ne faut pas supprimer les avertissements dans les classes ou les méthodes car on pourrait ignorer d'autres avertissements supprimés accidentellement. Mais à mon humble avis, il est absolument raisonnable de supprimer un avertissement qui affecte uniquement une seule ligne de code.
la source
Voici un cas intéressant: la méthode reçoit une collection générique et retourne une collection générique du même type de base. Par exemple:
Cette méthode peut être simulée avec la combinaison de Mockito anyCollectionOf matcher et de Answer.
la source