2012-05-11 11 views
15

Ist es möglich, (mit Mockito) Methode mit Signatur Set<? extends Car> getCars() ohne Unterdrückungswarnungen zu verspotten? Ich habe versucht:Mock-Methode mit generischen und erweitert im Rückgabetyp

XXX cars = xxx; 
when(owner.getCars()).thenReturn(cars); 

aber egal, wie ich cars erkläre ich alle Tage einen Kompilierungsfehler erhalten. beispiel wenn ich wie dies

Set<? extends Car> cars = xxx 

erklären erhalte ich die Standard-generic/Mockito Kompilierungsfehler

The method thenReturn(Set<capture#1-of ? extends Car>) in the type OngoingStubbing<Set<capture#1-of ? extends Car>> is not applicable for the arguments (Set<capture#2-of ? extends Car>) 
+0

welche Kompilierungsfehler Sie bekommen, können Sie kopieren/einfügen? – miks

+1

Warnung Unterdrückung, Kompilierungsfehler und Ausnahmen sind alles verschiedene Dinge ... Ich denke, Sie könnten sie hier verwirren. –

+0

ich habe versucht alles genau zu erklären. Also noch einmal klar sein. Ich möchte meinen Code kompilieren. Ich möchte auch, dass dieser Code keine Warnungen und kein '@ SupressWarning 'hat. Ich habe nie etwas über Ausnahmen erwähnt. hoffe das hilft – piotrek

Antwort

30

Verwenden doReturn-wenn alternative Anstoßen Syntax.

-System im Test:

public class MyClass { 
    Set<? extends Number> getSet() { 
    return new HashSet<Integer>(); 
    } 
} 

und der Testfall:

import static org.mockito.Mockito.*; 

import java.util.HashSet; 
import java.util.Set; 

import org.junit.Test; 

public class TestMyClass { 
    @Test 
    public void testGetSet() { 
    final MyClass mockInstance = mock(MyClass.class); 

    final Set<Integer> resultSet = new HashSet<Integer>(); 
    resultSet.add(1); 
    resultSet.add(2); 
    resultSet.add(3); 

    doReturn(resultSet).when(mockInstance).getSet(); 

    System.out.println(mockInstance.getSet()); 
    } 
} 

Keine Fehler oder Warnunterdrückung erforderlich

+1

hässlich, aber funktioniert. Ich hasse diese Syntax aus zwei Gründen. Lesbarkeit und die Tatsache, dass wir komplett auf Generika verzichten. Ist das wirklich unmöglich mit Generika? – piotrek

+0

Ich verstehe Ihre Abneigung gegen die Syntax, ich bevorzuge auch die Wenn-dann-Syntax. Ich verstehe nicht, was Sie damit meinen, dass es unmöglich ist, es mit Generika zu tun. –

+0

Ich spreche über den Parameter von doReturn. es ist ein Objekt. Es ist in keiner Weise an den Typ gebunden, der zurückgegeben werden soll. Es gibt keine Überprüfung der Kompilierungszeit. Aber wenn ich keine bessere Antwort bekomme, werde ich diese nehmen, weil wie gesagt - es funktioniert – piotrek

Verwandte Themen