180 votes

Mockito correspond à n'importe quel argument de classe

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 retourner un new B() quelle que soit la classe passée dans method ? La tentative suivante ne fonctionne que pour le cas spécifique où A est apparié.

A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);

EDIT : Une solution est

(Class<?>) any(Class.class)

9 votes

Class<?> incroyable !

0 votes

Votre solution (Class<?>) any(Class.class) devrait être la réponse ici. Je préférerais de loin utiliser cette solution plutôt que la classe ClassOrSubclassMatcher vue ci-dessous.

0 votes

@superbAfterSemperPhi et johan-sjöberg J'ai posté une autre façon de faire cela, sans casting. Je pense que cela pourrait être une meilleure façon. Qu'en pensez-vous ?

1voto

Nachbar90 Points 428

Aucun des exemples ci-dessus n'a fonctionné pour moi, car je dois simuler une méthode plusieurs fois pour différents paramètres de type de classe.

Au lieu de cela, cela fonctionne.

//Handle InstrumentType.class
Mockito.doReturn(new InstrumentTypeMapper() {
    @Override
    public InstrumentType map(String sourceType) throws Exception {
        return InstrumentType.Unknown;
    }
}).when(mappingLoader).load(any(ServiceCode.class), argThat(new ArgumentMatcher<Class<InstrumentType>>() {
    @Override
    public boolean matches(Class<InstrumentType> argument) {
        return InstrumentType.class.isAssignableFrom(argument);
    }
}));

//Handle InstrumentSubType.class    
Mockito.doReturn(new InstrumentSubTypeMapper() {
    @Override
    public InstrumentSubType map(String sourceType) throws Exception {
        return InstrumentSubType.istNone;
    }
}).when(mappingLoader).load(any(ServiceCode.class), argThat(new ArgumentMatcher<Class<InstrumentSubType>>() {
    @Override
    public boolean matches(Class<InstrumentSubType> argument) {
        return InstrumentSubType.class.isAssignableFrom(argument);
    }
}));

Voici la version courte :

Mockito.doReturn(new InstrumentTypeMapper() {
    @Override
    public InstrumentType map(String sourceType) throws Exception {
        return InstrumentType.Unknown;
    }
}).when(mappingLoader).load(any(ServiceCode.class), argThat((ArgumentMatcher<Class<InstrumentType>>) InstrumentType.class::isAssignableFrom));

Mockito.doReturn(new InstrumentSubTypeMapper() {
    @Override
    public InstrumentSubType map(String sourceType) throws Exception {
        return InstrumentSubType.istNone;
    }
}).when(mappingLoader).load(any(ServiceCode.class), argThat((ArgumentMatcher<Class<InstrumentSubType>>) InstrumentSubType.class::isAssignableFrom));

Comme vous pouvez le voir, j'utilise un système personnalisé. ArgumentMatchers en même temps que argThat Je ne sais pas s'il existe un moyen plus court qui fonctionne également.

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