EDIT: Ich habe erstellt schließlich eine issue auf Mockito Github-Projekt.Mockito returnsFirstArg() funktioniert nicht mit generischen ersten arg
Ich versuche, die typisierte Methode getNameElement
der Schnittstelle RoomGeneralService
zu verspotten die erste arg zurück, mit Mockito AdditionalAnswers.returnsFirstArg
Funktionalität:
Schnittstelle zu verspotten:
interface PrimaryKeyElement<T> {
public String getNameElement(T primaryKey);
}
interface RoomGeneralService extends PrimaryKeyElement<String> {
// ...
}
Mein Test (beachten Sie die Importe)
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
public class SampleTest {
@Mock
RoomGeneralService roomGeneralService;
@Test
public void testFoo() throws Exception {
when(roomGeneralService.getNameElement(anyString())).thenAnswer(returnsFirstArg());
//...
}
}
Auch habe ich mit anderen Kombinationen ausprobiert, aber bisher ohne Erfolg:
when(roomGeneralService.getNameElement(Matchers.<String>any())).thenAnswer(returnsFirstArg());
doAnswer(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));
doReturn(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));
Fehler empfangen:
Der Grund für diesen Fehler können sein: 1. Der wollte Argument Position ist falsch. 2. Die Antwort wird auf die falsche Interaktion verwendet.
Position des gesuchten Arguments 0 ist und das mögliche Argument Indizes für diese Methode ist: [0]
Abhilfe Objekt
Ich weiß, dass ich meine eigene Antwort erstellen, und in der Tat, es funktioniert gut, wenn statt Verwendung returnFirstArg()
ich etwas wie folgt aus:
when(roomGeneralService.getNameElement(anyString())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return (String) invocation.getArguments()[0];
}
});
Aber ich würde returnFirstArg()
wie im Rest meiner Tests verwenden (Tests sauberer aussehen), sowie das Spotten funktioniert gut, wenn die Methode getNameElement
ein String
statt T
arg erhalten würde.
Danke für die Hilfe.
Zunächst einmal, vielen Dank für die Beantwortung. Leider ist das Überschreiben von Methoden keine Option für das Projekt. Wenn Mockito das nicht kann, gehe ich lieber mit der Problemumgehung fort. – troig
@troig Sie kontrollieren nicht den Quellcode dieser Schnittstellen? –
Nein, das ist das Problem. Danke für deine Annäherung. – troig