Mockito: Methoden die Class-Objekte liefern
Mocken von Methoden die Class-Objekte liefern
Ein spezielles Problem ist das mocken von Methoden die Class
-Objekte liefern.
Betrachten wir dazu folgende Klasse:
class Foo { Class<?> klasse() { return String.class; } }
Das Mocken der Methode klasse
könnte dann so aussehen:
Mockito.when(foo.klasse()).thenReturn(Integer.class);
Läuft aber auf einen Fehler. Was den Fehler tatsächlich verursacht ist noch zu untersuchen, jedenfalls geht's so nicht -- aber wie dann? Es giebt dafür mindestens zwei work arounds:
Casting
Der Fehler mit dem uns der Compiler konfrontiert sieht so aus:
The method thenReturn(Class<capture#3-of ?>) in the type OngoingStubbing<Class<capture#3-of ?>> is not applicable for the arguments (Class<Integer>)
Was hingegen nicht funktioniert ist ein Casting von Integer.class
auf Class<?>
.
Wo also hincasten? Das Problem hat anscheinend etwas mit der Parametrisierung des Typs der Klasse Class
, verwendet man stattdessen den raw type funktionierts:
Mockito.when(foo.klasse()).thenReturn((Class) Integer.class);
Allerdings warnt der Compiler dann vor der Verwendung des raw types. Wen das nicht anficht, der kann's so machen.
doReturn...when
Die elegantere Methode führt über die Umgehung des when...then-Konstrukts. Ohne lange Vorrede:
Mockito.doReturn(Integer.class).when(foo).klasse();
Dieses Konstrukt vermeidet auch die Compiler-Warnung.