Esto podría parecer una pregunta muy detallada sobre Easymock, pero me está costando encontrar un sitio de soporte/foro/lista de correo para esta biblioteca.Easymock: ¿importa el orden de las capturas?
Me encuentro con un error cuando se utiliza el método captures()
que parece devolver los parámetros capturados fuera de servicio.
Aquí hay una versión simplificada de lo que estoy probando:
public class CaptureTest extends TestCase {
// interface we will be mocking
interface Processor {
void process(String x);
}
// class that uses the interface above which will receive the mock
class Component {
private Processor processor;
private String[] s = { "one", "two", "three", "four" };
Component(Processor processor) {
this.processor = processor;
}
public void doSomething() {
for (int i = 0; i < s.length; i++) {
processor.process(s[i]);
}
}
}
public void testCapture() {
//create the mock, wire it up
Processor mockProcessor = createMock(Processor.class);
Component component = new Component(mockProcessor);
//we're going to call the process method four times
//with different arguments, and we want to capture
//the value passed to the mock so we can assert against it later
Capture<String> cap1 = new Capture<String>();
Capture<String> cap2 = new Capture<String>();
Capture<String> cap3 = new Capture<String>();
Capture<String> cap4 = new Capture<String>();
mockProcessor.process(and(isA(String.class), capture(cap1)));
mockProcessor.process(and(isA(String.class), capture(cap2)));
mockProcessor.process(and(isA(String.class), capture(cap3)));
mockProcessor.process(and(isA(String.class), capture(cap4)));
replay(mockProcessor);
component.doSomething();
//check what values were passed to the mock
assertEquals("one", cap1.getValue());
assertEquals("two", cap2.getValue());
assertEquals("three", cap3.getValue());
assertEquals("four", cap4.getValue());
verify(mockProcessor);
}
}
(Tenga en cuenta que esto es sólo un caso de prueba simplificada - Yo sé que podría especificar el valor exacto de los argumentos que esperan pasado a mi simulacro, pero en mi caso real los argumentos son objetos complejos con un puñado de campos, y quiero capturar el objeto para que pueda afirmar contra solo algunos de esos campos sin volver a crear todo el objeto en mi caso de prueba).
Cuando ejecuto la prueba, se produce un error en:
junit.framework.ComparisonFailure: se esperaba: < [un]> pero era: < [cuatro]>
Lo que significa que la El parámetro que EasyMock está capturando en cap1
no es la primera llamada al método, pero la última (dado que el valor es four
). Obtengo los mismos resultados si invierto las declaraciones captures()
, es decir, uso cap4
con la primera llamada al método, etc.
Parece que podría ser un error dentro de EasyMock: diferentes parámetros pasados al mismo método en diferentes invocaciones no parece ser capturado correctamente
¿Alguien más está usando capture()
con EasyMock y tiene problemas similares? ¿Hay alguna solución fácil que conozcas o una forma diferente de capturar los parámetros que se pasan a los métodos de mi simulacro?
Actualización 1: ejemplo de código fijo para mostrar que estoy usando createMock
, no createStrictMock
, pero me da el mismo error con ambos (aunque el valor real de lo que capta los cambios).
He estado viendo este problema y es bastante confuso. Si realiza una instrucción System.out.println en cada una de las capturas, verá lo siguiente con createMock: cuatro, cuatro, cuatro, cuatro. Con un createStrickMock: dos, dos, tres, cuatro. – hooknc
¡Eso definitivamente suena como un error! He enviado un error en la página sourceforge de Easymock, con suerte alguien responderá, aunque por la falta de listas de correo, foros/comentarios en la página principal, etc., tengo la sensación de que el soporte es extremadamente limitado :( –