web-dev-qa-db-fra.com

EasyMock: Java.lang.IllegalStateException: 1 matcheurs attendus, 2 enregistrés

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.

  1. Chaque test réussit lorsqu'il est exécuté seul.
  2. Le premier test réussit toujours - ceci est vrai si je change l'ordre des tests dans le fichier.

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

16
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.

11
Mark Peters

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.

3
rogerdpack

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(),

2
nsfyn55

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)
}
0
user1371983