2017-10-12 3 views
-2

verweis Spion zu mock methods in same classein Verfahren innerhalb einer Klasse Mocking mit Mockito

class Temp() { 

public boolean methodA(String param) { 

    try { 

     if(methodB(param)) 
       return true; 

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

Die Testklasse

@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); 
} 

Wenn die wirkliche Klasse temp methodA Aufruf sollte verspottet Methode B Wert zurück. Also wieder wahr. Warum ist das falsch? Ich stoße auf das gleiche Problem. Ich möchte den Test auf die reale Klasse und nicht für Mock-Objekt wie von der Antwort vorgeschlagen ausführen. Ich möchte die Klasse methodA und erwarten, dass die verspottete Objekt spyTemp methodeB Wert laufen, wenn es

+0

Bitte post a [mcve]. Es ist 'methodB (param)' in der verknüpften Frage nicht 'methodB()' –

+0

Ich verstehe nicht, warum Sie die verknüpfte Frage erneut stellen müssen. Die Antwort dort beantwortet deine Frage hier schon. – Tom

+0

jetzt muss ich wissen, ob methodB öffentlich ist oder nicht. wenn es privat ist, musst du damit umgehen, als ob der Code in Methode A geschrieben wäre und wenn es öffentlich ist, könntest du dich darüber lustig machen. – LenglBoy

Antwort

1

hier genannt wird, ist das Problem: methodA() du bist callint von temp und you've definiert eine Rückkehr Wert von tempSPY.

Sie müssen also tempSpy.methodA() anrufen und dann den Wert von methodB(), den Sie definiert haben, zurückgeben.

Hier ist die Lösung, wenn methodB() ist public - Spion temp/schneiden und es auf diese Weise nennen:

// temp = cut 
@Test 
public void testMethodA_valid() { 
    // given 
    Temp spyTemp = Mockito.spy(temp); 
    boolean expected = true; 
    Mockito.doReturn(expected).when(spyTemp).methodB(Mockito.any(String.class)); 

    // when 
    boolean actual = spyTemp.methodA("XYZ"); 

    // then (faster readable)  
    Mockito.verify(spyTemp, times(1)).methodB(any(String.class)) 
    Mockito.verifyNoMoreInteraction(<ALL YOUR MOCKS HERE>); 
    Assert.assertEquals(expected, is(equalTo(actual))); 
} 

Wenn methodB() privat kann nicht Sie definieren, was es zurückgeben sollte. Dann ist das nicht nur und wenn ein Fehler auftritt, dann methodB() hat falsches Verhalten:

@Test 
public void testMethodA_valid() { 
    // given 
    boolean expected = true; 

    // when 
    boolean actual = temp.methodA("XYZ"); 

    // then (faster readable)  
    Assert.assertEquals(expected, is(equalTo(actual))); 
} 
+0

Aber was, wenn ich die Klasse methodA ausführen möchte und das verspottete Objekt spyTemp methodB Wert erwartet, wenn es – learningUser

+0

keinen Sinn heißt. Also geh 'hin, um dir Testklasse/Methode zu sagen, was es zurückgeben soll und dann bestätige es. Sie werden es jedes Mal passieren und Sie können kein falsches Verhalten überprüfen. – LenglBoy

+0

und verwenden Sie keine fest codierten Werte. setze 'expectedValue = true' und setze es mit' actualValue' vom Methodenaufruf – LenglBoy

Verwandte Themen