Mockito: en utilisant une méthode “thenReturn” pour revenir à un simulacre ne fonctionne pas
J'ai rencontré ce que je suppose peut-être un bug avec Mockito, mais je me demandais si quelqu'un d'autre peut faire la lumière pourquoi ce test ne fonctionne pas.
En gros, j'ai deux objets, comme ceci:
public class FirstObject {
private SecondObject secondObject;
public SecondObject getSecondObject() { return secondObject; }
}
public class SecondObject {
private String name;
public String getName() { return name; }
}
Le premier objet est tournée en dérision par l'annotation et l'avant de la méthode:
@Mock
FirstObject mockedFirstObject;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
Le deuxième objet est moqué dans une méthode:
public SecondObject setupMockedSecondObject() {
SecondObject secondObject = Mockito.mock(SecondObject.class);
Mockito.when(secondObject.getName()).thenReturn("MockObject");
return secondObject;
}
Quand thenReturn
contient un appel direct à cette méthode d'installation et d'obtenir une maquette de la deuxième objet, il échoue:
@Test
public void notWorkingTest() {
Mockito.when(mockedFirstObject.getSecondObject()).thenReturn(setupMockedSecondObject());
Assert.assertEquals(mockedFirstObject.getSecondObject().getName(), "MockObject");
}
Mais, lorsque la maquette est retourné par la même méthode est affectée à une variable locale, qui est utilisé dans thenReturn
, il travaille:
@Test
public void workingTest() {
SecondObject mockedSecondObject = setupMockedSecondObject();
Mockito.when(mockedFirstObject.getSecondObject()).thenReturn(mockedSecondObject);
Assert.assertEquals(mockedFirstObject.getSecondObject().getName(), "MockObject");
}
Faisons-nous quelque chose de mal ou est-ce en effet un bug/limitation dans Mockito? Est-il une volonté délibérée de raison pour que cela ne fonctionne pas?
- Définir ce qu'il échoue.
- Cela est probablement dû à la façon dont Mockito met en œuvre ses
when
/thenReturn
(ou autres) des appels. Vous êtes à la rupture de cette chaîne, en invoquant une autrewhen
/thenReturn
cycle avant l'appel de la précédentethenReturn
.
Vous devez vous connecter pour publier un commentaire.
C'est en effet une limitation de Mockito, et il est référencé dans leur FAQ:
La solution de contournement, comme mentionné, est de stocker de l'souhaité la valeur de retour dans une variable locale, comme vous l'avez fait.
La façon dont je le comprends, c'est que Mockito valide l'utilisation que vous en faites chaque fois que vous appelez ses méthodes. Lorsqu'une autre méthode est appelée lors d'un stubbing processus, vous êtes en rupture son processus de validation.