2016-08-29 5 views
1

Ich benutze Mockito, um eine Methode in der gleichen Klasse zu verspotten, für die ich Test schreibe. Ich habe andere Antworten auf SO (Mocking method in the same class) gesehen, aber wahrscheinlich missverstanden ich sie, da ich auf Probleme stoße.Mock Methoden in der gleichen Klasse

class Temp() { 

    public boolean methodA(String param) { 

     try { 

      if(methodB(param)) 
        return true; 

      return false; 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } 
    } 
} 

Meine Testmethode:

@Test 
public void testMethodA() { 

    Temp temp = new Temp(); 
    Temp spyTemp = Mockito.spy(temp); 

    Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
    boolean status = temp.methodA("XYZ"); 

    Assert.assertEquals(true, status); 
} 

ich die expection jedoch erhalten ausgedruckt, weil Definition von methodeB ausgeführt wird. Mein Verständnis ist die Definition der MethodeB würde mit spyTemp verspottet werden. Dies scheint jedoch nicht der Fall zu sein.

Kann mir bitte jemand erklären, wo ich falsch liege?

Antwort

3

Das erste Problem ist, dass Sie spyTest-Objekt verwenden müssen, um etwas von Mockito zu erwarten. Hier ist es nicht dasselbe wie Test. spyTemp ist ein von Mockito verpacktes Objekt temp.

Ein weiteres Problem ist, dass Sie nur methodB() stub, aber versuchen, methodA() ausführen. Ja in Ihrer Implementierung von methodA() rufen Sie methodB(), aber Sie rufen this.methodB(), nicht als spyTemp.methodB(). Hier müssen Sie verstehen, dass Spott nur funktioniert, wenn Sie es auf der Instanz temp aufrufen. Es wird von Mockito-Proxy eingehüllt, die Ihren Anruf abfangen, und wenn Sie irgendeine Methode überschrieben haben, würde es Ihre neue Implementierung anstelle des Originals aufrufen. Aber seit der ursprünglichen Methode aufgerufen, wissen Sie nichts über Mockito Proxy. So würde Ihr „außer Kraft gesetzt“ Methode nur aufgerufen werden, wenn Sie spyTemp.methodB() laufen

Diese Arbeit sollte:

Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
boolean status = spyTemp.methodB("XYZ"); 
2

Sie haben einen Spion und verspottet methodB(). Das ist richtig! Aber Sie haben methodA() auf dem ursprünglichen Objekt aufgerufen. Um

boolean status = spyTemp.methodA("XYZ"); 
1

Beachten Sie Folgendes aus Mockito Dokumentation das richtige Ergebnis nennt es auf dem Spione zu erhalten:

Mockito nicht Delegat ruft in der realen Instanz übergab, statt es tatsächlich schafft eine Kopie davon. Wenn Sie also die reale Instanz und damit interagieren, erwarten Sie nicht, dass der Spion diese Interaktion und deren Auswirkungen auf den Zustand der realen Instanz bemerkt. Die logische Folge ist dass, wenn ein unstubbed Methode auf dem Spion genannt wird aber nicht auf dem echte Instanz, Sie werden keine Auswirkungen auf die Real Beispiel sehen.

Dies bezieht sich speziell auf Ihre Situation. Sie behalten einen Verweis auf temp und rufen Sie dann methodA. Mockito spioniert diese Instanz überhaupt nicht aus; es spioniert auf spyTemp aus. So wird der normale methodB aufgerufen.

Beachten Sie, dass Sie für neuen Code teilweise Mocks vermeiden sollten.

Verwandte Themen