2013-06-03 2 views
18

Ich versuche, einen Komponententest zu schreiben, und dafür schreibe ich eine When-Anweisung für einen Mockito-Mock, aber ich kann nicht scheinen, um zu erkennen, dass meine Rückgabewert ist gültig.Kann Klassenobjekt mit Mockito nicht zurückgeben

Hier ist, was ich tue:

Class<?> userClass = User.class; 
when(methodParameter.getParameterType()).thenReturn(userClass); 

Der Rückgabetyp .getParameterType() ist Class<?>, so verstehe ich nicht, warum Eclipse sagt, The method thenReturn(Class<capture#1-of ?>) in the type OngoingStubbing<Class<capture#1-of ?>> is not applicable for the arguments (Class<capture#2-of ?>). Es bietet an, meine userClass zu casten, aber das bringt nur etwas verstümmeltes Zeug dazu, dass die Eclipse sagt, dass sie erneut casten muss (und nicht casten kann).

Ist das nur ein Problem mit Eclipse oder mache ich etwas falsch?

Antwort

9

Ich bin nicht sicher, warum Sie diesen Fehler erhalten. Es muss etwas Besonderes mit der Rückkehr Class<?> zu tun haben. Ihr Code wird gut kompiliert, wenn Sie Class zurückgeben. Dies ist eine Simulation dessen, was Sie tun und dieser Test besteht. Ich denke, das wird für Sie arbeiten, auch:

package com.sandbox; 

import org.junit.Test; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.stubbing.Answer; 

import static org.mockito.Mockito.*; 

import static junit.framework.Assert.assertEquals; 

public class SandboxTest { 

    @Test 
    public void testQuestionInput() { 
     SandboxTest methodParameter = mock(SandboxTest.class); 
     final Class<?> userClass = String.class; 
     when(methodParameter.getParameterType()).thenAnswer(new Answer<Object>() { 
      @Override 
      public Object answer(InvocationOnMock invocationOnMock) throws Throwable { 
       return userClass; 
      } 
     }); 

     assertEquals(String.class, methodParameter.getParameterType()); 
    } 

    public Class<?> getParameterType() { 
     return null; 
    } 


} 
+0

Ja, es scheint, dass es ein Problem mit Eclipse oder Mockito sein muss. Ich war in der Lage, Ihren Vorschlag umzusetzen, und das hat sich herumgesprochen, also danke! – CorayThan

+0

@CorayThan Es ist nicht Eclipse. Dies wird auch nicht in Intellij kompiliert. –

+0

Gleiches in NetBeans. –

44

Auch eine etwas lapidaren Weg, dies zu umgehen, die tun Syntax statt, wenn zu verwenden ist.

doReturn(User.class).when(methodParameter).getParameterType(); 
+1

Toller Tipp! Dies sollte akzeptiert werden! –

+0

Dies ist die sauberste Lösung. – Scott

+0

Super ... yup, sauberste Lösung. Danke vielmals. –

22
Class<?> userClass = User.class; 
OngoingStubbing<Class<?>> ongoingStubbing = Mockito.when(methodParameter.getParameterType()); 
ongoingStubbing.thenReturn(userClass); 

Die OngoingStubbing<Class<?>> zurück von Mockito.when ist nicht die gleiche Art wie ongoingStubbing weil jeder '?' Wildcard könnte an einen anderen Typ gebunden sein.

Um die Typen Spiel zu machen, müssen Sie explizit den Typ-Parameter angeben:

Class<?> userClass = User.class; 
Mockito.<Class<?>>when(methodParameter.getParameterType()).thenReturn(userClass); 
+0

Der Teil: 'Mockito. > wann war der schlüssel. Danke für die Antwort. –

+0

Meiner Meinung nach ist die Verwendung expliziter Typisierung eine elegantere Lösung als die aktuell als "richtig" gewertete Antwort –

1

ich die Code-Beispiele hier ein wenig verwirrend mit dem Einsatz von methodParameter.getParameterType() zuerst in der akzeptierte Antwort des verwendeten gefunden SandBoxTest. Nachdem ich ein wenig mehr gegraben habe, fand ich another thread pertaining to this issue, die ein besseres Beispiel lieferte. Dieses Beispiel machte deutlich, dass der Mockito-Aufruf, den ich brauchte, doReturn (myExpectedClass) .when (myMock) .callsMyMethod (withAnyParams) war. Mit diesem Formular kann ich eine Rückgabe der Klasse verspotten. Hoffentlich hilft diese Notiz jemandem, der in Zukunft nach einem ähnlichen Problem sucht.