J'ai un problème avec EasyMock 2.5.2 et JUnit 4.8.2 (avec Eclipse). J'ai lu tous les articles similaires ici mais je n'ai pas trouvé de réponse. J'ai une classe contenant deux tests qui testent la même méthode. J'utilise des matchers.
Voici une version simplifiée du code de test:
private Xthing mockXthing;
private MainThing mainThing;
@Before
public void setUp() {
mockXthing = EasyMock.createMock(Xthing.class);
mainThing = new MainThing();
mainThing.setxThing(mockXthing);
}
@After
public void cleanUp() {
EasyMock.reset(mockXthing);
}
@Test
public void testTwo() {
String abc = "abc";
EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc);
EasyMock.replay(mockXthing);
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
assertEquals("abc", testResult);
EasyMock.verify(mockXthing);
}
@Test
public void testOne() {
String xyz = "xyz";
EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
EasyMock.replay(mockXthing);
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
assertEquals("xyz", testResult);
EasyMock.verify(mockXthing);
}
Le deuxième (ou dernier) test échoue toujours avec l'erreur suivante:
Java.lang.IllegalStateException: 1 matchers expected, 2 recorded
Toute idée à ce sujet serait grandement appréciée.
Merci Anne
Je n'ai pas encore regardé attentivement, mais cela semble suspect:
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
anyObject()
est un matcher et vous l'appelez after the replay. Ce n'est pas utilisé pour produire un objet. Il est utilisé pour indiquer à EasyMock allow tout objet. EasyMock détecte ce complément, mais il n'est pas dangereux avant le deuxième test. À ce stade, le nombre de correspondants que EasyMock a enregistrés mais n'a pas encore utilisés (2) ne correspond pas au nombre de paramètres attendus pour le deuxième appel doXthing
(1).
Vous devriez passer dans real parameters à testCallingXthing
(ou une maquette qui est en mode de relecture). Essayez de transmettre directement null
ou une valeur réelle telle que 2
.
pour moi, cet échec (dans mon cas, 2 correspondants, 4 enregistrés.) signifiait "vous mélangez easymock et mockito dans le même test unitaire, appelant donc accidentellement la méthode notNull () de easymock pour un argument mockito. les tests sont exécutés dans un certain ordre.
Essayez:
String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));
Il existe plus d’adaptateurs précis que anyObject()
. Celles-ci vous permettent de faire des assertions de type sur les collaborateurs.
À partir de documentation EasyMock :
eq(X value)
Correspond si la valeur réelle est égale à la valeur attendue. Disponible pour tous les types primitifs et pour les objets.anyBoolean()
,anyByte()
,anyChar()
,anyDouble()
,anyFloat()
,anyInt()
,anyLong()
,anyObject()
,anyShort()
,
Vous devez réinitialiser après chaque méthode de test pour éliminer ce problème. L'ajout de code ci-dessous résoudra ce problème.
@After
public void after(){
EasyMock.reset(mockXthing)
}