Por lo tanto, estoy creando un objeto simulado como una variable estática en el nivel de la clase de esta manera ... En una prueba, quiero Foo.someMethod()
devolver un cierto valor, mientras que en otra prueba, quiero que devuelva un valor diferente. El problema que tengo es que parece que necesito reconstruir los simulacros para que esto funcione correctamente. Me gustaría evitar reconstruir los simulacros y usar los mismos objetos en cada prueba.
class TestClass {
private static Foo mockFoo;
@BeforeClass
public static void setUp() {
mockFoo = mock(Foo.class);
}
@Test
public void test1() {
when(mockFoo.someMethod()).thenReturn(0);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value
}
@Test
public void test2() {
when(mockFoo.someMethod()).thenReturn(1);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.
}
}
En la segunda prueba, sigo recibiendo 0 como valor cuando se llama a testObj.bar () ... ¿Cuál es la mejor manera de resolver esto? Tenga en cuenta que sé que podría usar un simulacro diferente Foo
en cada prueba, sin embargo, tengo que encadenar varias solicitudes mockFoo
, lo que significa que tendría que encadenar en cada prueba.
test1
y luegotest2
. Pero puede ser que su entorno de integración continua ejecute las pruebas en el otro orden. O puede ser que desee ejecutarlotest2
solo, sin ejecutartest1
primero, en cuyo caso fallará. Las pruebas unitarias siempre deben ser independientes entre sí; y nunca debería haber una dependencia entre pruebas individuales, o una dependencia en un orden particular de pruebas. Mientras que encadenandothenReturn
declaraciones ...thenReturn
, no es una solución correcta en este caso particular. Me parece que las hordas de votantes de aquí probablemente no han entendido la pregunta.@FixMethodOrder
Para todos los que buscan devolver algo y luego otra excepción de lanzamiento de llamada:
o
fuente
O, incluso más limpio:
fuente
Para cualquier persona que use spy () y doReturn () en lugar del método when ():
lo que necesita para devolver un objeto diferente en diferentes llamadas es esto:
.
Para simulacros clásicos:
o con una excepción lanzada:
fuente