Mockito: Methoden die Class-Objekte liefern

Aus MimiPedia
Version vom 23. Juni 2021, 18:15 Uhr von Ullrich (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „= Mocken von Methoden die Class-Objekte liefern = Ein spezielles Problem ist das mocken von Methoden die {{java|Class}}-Objekte liefern. Betrachten wir dazu fo…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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.