Mockito: Methoden die Class-Objekte liefern: Unterschied zwischen den Versionen

Aus MimiPedia
(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…“)
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
[[Category:Java]]
[[Category:Mockito]]
= Mocken von Methoden die Class-Objekte liefern =
= Mocken von Methoden die Class-Objekte liefern =
Ein spezielles Problem ist das mocken von Methoden die {{java|Class}}-Objekte liefern.
Ein spezielles Problem ist das mocken von Methoden die {{java|Class}}-Objekte liefern.

Version vom 23. Juni 2021, 18:16 Uhr

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.