EasyMock: java.lang.IllegalStateException: se esperan 1 coincidencias, se registraron 2
matcher (4)
Estoy teniendo un problema con EasyMock 2.5.2 y JUnit 4.8.2 (ejecutando a través de Eclipse). He leído todos los mensajes similares aquí, pero no he encontrado una respuesta. Tengo una clase que contiene dos pruebas que prueban el mismo método. Estoy usando emparejadores.
- Cada prueba pasa cuando se ejecuta solo.
- La primera prueba siempre pasa; esto es cierto si cambio el orden de las pruebas en el archivo.
Aquí hay 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);
}
La segunda (o última) prueba siempre falla con el siguiente error:
java.lang.IllegalStateException: 1 matchers expected, 2 recorded
Cualquier idea de esto sería muy apreciada.
Gracias anne
Debería reiniciar el simulacro después de cada método de prueba para deshacerse de este problema. Agregar el código a continuación resolverá este problema.
@After
public void after(){
EasyMock.reset(mockXthing)
}
Todavía no he mirado meticulosamente, pero esto parece sospechoso:
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
anyObject()
es un comparador y lo llamas después de la repetición. No se utiliza para producir ningún objeto. Se utiliza para indicar a EasyMock que permita cualquier objeto. EasyMock está detectando ese emparejador adicional, pero no es perjudicial hasta la segunda prueba. En ese momento, la cantidad de coincidencias 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).
Debería pasar parámetros reales a testCallingXthing
(o un simulacro que está en modo de reproducción). Intenta pasar null
directamente, o un valor real como 2
.
para mí, esta falla (en mi caso, se esperaban 2 coincidencias, 4 grabadas) significaba que "estás mezclando easymock y mockito en la misma prueba de unidad, por lo que accidentalmente llamas al método notNull () de easymock para un argumento mockito. Lo que causa la falla pero solo si Las pruebas se ejecutan en un cierto orden.
Tratar:
String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));
Hay más matchers refinados que anyObject()
. Estos le permiten hacer aseveraciones basadas en tipos sobre los colaboradores.
De la documentación de EasyMock :
eq(X value)
Coincide si el valor real es igual al valor esperado. Disponible para todos los tipos primitivos y para objetos.
anyBoolean()
,anyByte()
,anyChar()
,anyDouble()
,anyFloat()
,anyInt()
,anyLong()
,anyObject()
,anyShort()