2017-10-12 2 views
-2

référenceurs à mock methods in same classMocking une méthode dans une classe en utilisant Mockito espion

class Temp() { 

public boolean methodA(String param) { 

    try { 

     if(methodB(param)) 
       return true; 

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

La classe de test

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

Lorsque vous appelez la vraie température de classe à methodA doit renvoyer la valeur de la méthode B moqué. Donc revenant vrai. Pourquoi est-ce incorrect? Je rencontre le même problème. Je veux lancer le test sur la vraie classe et non sur l'objet fantaisie comme suggéré par la réponse. Je veux courir la classe methodA et attendre l'objet moqué spyTemp valeur methodB lorsqu'elle est appelée

+0

Veuillez poster un [mcve]. C'est 'methodB (param)' dans la question liée pas 'methodB()' –

+0

Je ne comprends pas pourquoi vous devez re-poser la question liée. La réponse là répond déjà à votre question ici. – Tom

+0

alors maintenant j'ai besoin de savoir si methodB est publique ou non. Si c'est privé, vous devez le gérer comme si son code était écrit dans la méthode A et s'il était public, vous pourriez le railler. – LenglBoy

Répondre

1

Voici le problème: methodA() est de callint vous êtes temp et you've une valeur définie de retour tempSPY.

Vous avez donc besoin d'appeler tempSpy.methodA() puis de retourner la valeur de methodB() que vous avez définie.

Voici la solution si methodB() est public - température espion/couper et l'appeler ainsi:

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

Si methodB() est privé, vous ne pouvez pas définir ce qu'elle devrait revenir. Alors n'est-ce pas le cas et si une erreur survient alors methodB() a eu un mauvais comportement:

@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

Mais que se passe-t-il si je veux lancer la méthode methodA et attendre l'objet mocké spyTemp methodB value quand il est appelé – learningUser

+0

n'a aucun sens là-bas. Il est donc bon de vous dire testclass/méthode ce qu'il devrait retourner puis l'affirmer. vous allez le passer à chaque fois et vous ne pouvez pas vérifier tout comportement incorrect. – LenglBoy

+0

et n'utilisez pas de valeurs codées en dur. il suffit de définir 'expectedValue = true' et de l'affirmer avec' actualValue' depuis l'appel de la méthode – LenglBoy