replay java mocking easymock

java - replay - mockito



Obteniendo excepción del "simulacro agradable" de EasyMock con un depurador adjunto (3)

(Descargo de responsabilidad - EasyMock newb)

De acuerdo con la documentación (y esta publicación ), si quisiera usar EasyMock para generar objetos de código auxiliar, debería usar EasyMock.createNiceMock() . Un "buen simulacro" es en realidad un apéndice, es decir, un objeto que no participa en la validación, simplemente devuelve valores.

Sin embargo, el siguiente fragmento falla para mí con una IllegalStateException("missing behavior definition for the preceding method") , en la segunda línea foo.translate() .

Foo foo = EasyMock.createNiceMock(Foo.class); EasyMock.replay(foo); // added this line foo.translate("a", "b"); foo.translate("a", "b"); // only the second calls throws an exception

¿Alguien puede explicar esto, o más bien decirme cómo usar EasyMock para crear stubs con cero verbosidad (o (number_of_exercised_mock_methods)).

Editar : me he dado cuenta de que recibo estos errores casi siempre cuando se adjunta un depurador, pero nunca cuando no está conectado. ¿Alguna idea de cómo puede estar relacionado?


Si su método de traducción devuelve un valor, debe configurar una expectativa para ello.

expect(foo.translate("a","b")).andStubReturn(retVal);


Complementando la respuesta de Jeff.

Desde el método de EasyMock createNiceMock javadoc:

Crea un objeto simulado que implementa la interfaz determinada, la comprobación de órdenes está deshabilitada de forma predeterminada y el objeto simulado devolverá 0 , nulo o falso para las invocaciones inesperadas.

Un objeto simulado creado con este método no necesita ninguna configuración (invocaciones esperadas). Solo tienes que crearlo y "reproducirlo". Ejemplo:

ComplicatedObject stub = EasyMock.createNiceMock(); replay(stub);

Se permite cualquier llamada al método en el stub creado (no arrojará una excepción), y siempre devolverán el valor predeterminado (0, nulo o falso). Si configura una expectativa de invocación específica, tendrá que configurar su valor de retorno o obtendrá un error (ese es su caso).

Si desea restringir qué métodos se pueden ejecutar (haciendo que la prueba falle si se llama a un método inesperado), me temo que tendrá que crear un simulacro normal, configurar cada expectativa de invocación y un valor de retorno para cada uno de ellos. aquellos.


EasyMock.replay(foo) llamar a EasyMock.replay(foo) . Antes de hacer eso, su objeto simulado se encuentra en un "estado de registro". De la documentación de EasyMock:

En el estado de grabación (antes de volver a llamar), el objeto simulado no se comporta como un objeto simulado, pero registra las llamadas a métodos. Después de llamar a la repetición, se comporta como un Objeto Simulado, verificando si las llamadas al método esperado realmente están hechas.

Si desea crear un objeto stub, simplemente llame a createNiceMock seguido de la replay :

Foo foo = EasyMock.createNiceMock(Foo.class); EasyMock.replay(foo); foo.translate("a", "b"); foo.translate("a", "b");