Tengo una clase Foo
que es SUT y una clase Bar
, que es su colaboradora. Foo
llama al run(List<Object> values)
en el Bar
con "expectedList
" como argumento. Luego, Foo
agregará algunos elementos más a este List
para que su estado sea diferente de lo que era en el momento de llamar al run()
. Aquí está mi caso de prueba.¿Puede Mockito verificar los parámetros en función de sus valores en el momento de la llamada al método?
@Test
public void testFoo() {
Bar collaborator = spy(new Bar());
Foo sut = new Foo(collaborator);
verify(collaborator).run(expectedList);
}
Tenga en cuenta que el colaborador es en realidad un objeto espía en lugar de un simulacro. Este caso de prueba fallará porque aunque se llamó a run()
con un argumento igual a expectedList
, se modificó desde entonces y su valor actual ya no es igual a expectedList
. Sin embargo, esta es la forma en que se supone que funciona, así que me pregunto si hay una forma de que Mockito almacene la instantánea de los parámetros cuando se llama a un método y los verifica en base a estos valores en lugar de los valores más recientes.
Sí David tiene razón. Debido a la forma en que se elabora la API de Mockito, no es posible verificar varias llamadas con la misma referencia de argumento. EasyMock puede hacerlo porque tiene una fase de expectativa antes de ejecutar el código de producción. De todos modos, en lugar de una 'Respuesta' uso un' ArgurmentCaptor' y escribo una o más aserciones sobre el estado final de esa lista, es decir, con FEST-Assert 'assertThat (captor.getValue()). Contains (" A "," B ") .contains (" T "," U ");' – Brice
@Brice - ¿Cómo funcionaría eso de manera diferente al enfoque de Michael Wiles? –
No lo es. Es solo una forma diferente de lograr el propósito de la prueba. Porque la mayoría de las veces no es necesario verificar los argumentos intermedios, sino simplemente que se produjeron algunas interacciones y el resultado final.Aunque debo decir que si Tom tenía requisitos específicos, aceptó que esto no lo ayudaría, pero en este caso evitaría objetos mutables en mi código de producción. Parece que los mensajes entre dos colaboradores y los mensajes siempre deben ser inmutables. – Brice