2011-07-01 13 views
13

Tengo un problema con EasyMock 2.5.2 y JUnit 4.8.2 (ejecutando Eclipse). He leído todas las publicaciones similares aquí pero no he encontrado una respuesta. Tengo una clase que contiene dos pruebas que prueban el mismo método. Estoy usando emparejamientos.EasyMock: java.lang.IllegalStateException: 1 emparejador esperado, 2 registrado

  1. Cada prueba pasa cuando se ejecuta solo.
  2. La primera prueba siempre pasa; esto es cierto si cambio el orden de las pruebas en el archivo.

Aquí es una versión simplificada del código de prueba:

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

El segundo (o último) prueba siempre falla con el siguiente error:

java.lang.IllegalStateException: 1 matchers expected, 2 recorded 

Cualquier penetración a esto sería apreciado enormemente.

Gracias, Anne

+0

¿Qué línea arroja esa excepción? –

+0

Lo sentimos, en la segunda (o última) prueba -EasyMock.expect (mockXthing.doXthing ((String) EasyMock.anyObject())).andReturn (xyz); – Anne

+0

OK sí, creo que es lo que dice mi respuesta en ese momento. –

Respuesta

9

No he mirado de cerca meticulosamente todavía, pero esto parece sospechoso:

String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject()); 

anyObject() es una de coincidencias y que están llamando después de la repetición. No se usa para producir ningún objeto. Se usa para indicar a EasyMock permitir cualquier objeto. EasyMock está detectando ese emparejador adicional pero no es dañino hasta la segunda prueba. En ese momento, la cantidad de emparejamientos que EasyMock ha registrado pero aún no ha utilizado (2) no coincide con la cantidad de parámetros esperados para la segunda llamada doXthing (1).

Debe pasar en parámetros reales a testCallingXthing (o un simulacro que está en modo de reproducción). Intente pasar null directamente, o un valor real como 2.

+0

¡Estás en lo correcto! No tuve necesidad de utilizar los marcadores en la línea que publicaste. Podría pasar objetos reales o incluso nulos (el código de prueba real tiene 4 parámetros). Muchas gracias. – Anne

2

Probar:

String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong())); 

Hay comparadores más refinado que anyObject(). Éstos le permiten hacer afirmaciones basadas en tipos sobre colaboradores.

Desde el EasyMock documentation:

eq(X value)
Matches if the actual value is equals the expected value. Available for all primitive types and for objects.
anyBoolean() , anyByte() , anyChar() , anyDouble() , anyFloat() , anyInt() , anyLong() , anyObject() , anyShort()

3

para mí este fracaso (. En mi caso 2 comparadores de esperar, 4 registrada) significaba "está mezclando EasyMock y Mockito en la misma prueba de la unidad, por lo que accidentalmente llamar El método notNull() de easymock para un argumento de mockito. Lo que causa el error pero solo si las pruebas se ejecutan en un orden determinado

+0

Creo que este es mi caso también. Intenté la respuesta de Mark y no funcionó. La prueba aún falla intermitentemente. Voy a reescribir las pruebas solo en Mockito. – xli

+0

Para mí, utilicé un mezclador Easymock en lugar de un macther Hamcrest en una afirmación. A pesar de que había reiniciado y reproducido en el orden correcto, estaba grabándolos y haciendo que fallara la siguiente prueba. Esto me ayudó a encontrarlo. – twinj

0

Debe reiniciar el simulacro después de cada método de prueba para deshacerse de este problema. Agregar el siguiente código resolverá este problema.

@After 
public void after(){ 
    EasyMock.reset(mockXthing) 
} 
Cuestiones relacionadas