Existe-t-il un moyen de faire correspondre n'importe quel argument de classe de l'exemple de routine ci-dessous?
class A {
public B method(Class<? extends A> a) {}
}
Comment puis-je toujours renvoyer un, new B()
quelle que soit la classe à laquelle est passé method
? La tentative suivante ne fonctionne que pour le cas spécifique où A
correspond.
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
EDIT : Une solution est
(Class<?>) any(Class.class)
Class<?>
incroyable!Réponses:
Deux autres façons de le faire (voir mon commentaire sur la réponse précédente de @Tomasz Nurkiewicz):
Le premier repose sur le fait que le compilateur ne vous laissera tout simplement pas passer quelque chose du mauvais type:
Vous perdez la frappe exacte (le
Class<? extends A>
) mais cela fonctionne probablement comme vous en avez besoin.Le second est beaucoup plus complexe mais est sans doute une meilleure solution si vous voulez vraiment être sûr que l'argument de
method()
est uneA
ou une sous-classe deA
:Où
ClassOrSubclassMatcher
estorg.hamcrest.BaseMatcher
défini comme:Phew! J'irais avec la première option jusqu'à ce que vous ayez vraiment besoin d'un contrôle plus fin sur ce
method()
qui revient réellement :-)la source
if (obj instanceof Class)
choses gâchent pour moi, alors je l'ai enlevé.extends BaseMatcher<Class<T>>
pour justeextends BaseMatcher<T>
. Juste pour info, si quelqu'un d'autre obtient des erreurs de compilation, essayez-le.matches
fonction de ce qui suit:public boolean matches(Object obj) { if (obj != null) { return targetClass.isAssignableFrom(obj.getClass()); } return false; }
Il existe une autre façon de faire cela sans lancer:
Cette solution force la méthode
any()
à renvoyer leClass<A>
type et non sa valeur par défaut (Object
).la source
Matchers
est obsolète dans les nouvelles versions de Mockito et sera probablement supprimé dans la version 3.0. Utilisez à laArgumentMatchers
place:when(a.method(ArgumentMatchers.<Class<A>>any())).thenReturn(b);
Si vous ne savez pas quel package vous devez importer:
OU
la source
org.mockito.ArgumentMatchers.any
Que diriez-vous:
ou:
la source
method(A a)
- mais c'est (effectivement)method(Class<A> a)
- donc vous auriez besoin d'utiliser:when(a.method(isA(Class.class))).thenReturn(b);
ouwhen(a.method((Class<A>) notNull())).thenReturn(b);
la solution de Millhouse ne fonctionne plus avec la version récente de mockito
Cette solution fonctionne avec java 8 et mockito 2.2.9
où
ArgumentMatcher
est une instance deorg.mockito.ArgumentMatcher
Et l'utilisation
la source
public static <T> Class<T> subClassOf(Class<T> targetClass) { return argThat(new ClassOrSubclassMatcher<>(targetClass)); }