java - guia - ¿Cómo decirle a un objeto falso de Mockito que devuelva algo diferente la próxima vez que se llame?
mockito examples in java (3)
Entonces, estoy creando un objeto simulado como una variable estática en el nivel de clase como tal ... En una prueba, quiero que Foo.someMethod()
devuelva un cierto valor, mientras que en otra prueba, quiero que devuelva un diferente valor El problema que tengo es que parece que necesito reconstruir los simulacros para que esto funcione correctamente. Me gustaría evitar la reconstrucción de los simulacros y solo 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 testObj.bar () ... ¿Cuál es la mejor manera de resolver esto? Tenga en cuenta que sé que podría usar un simulacro diferente de Foo
en cada prueba, sin embargo, tengo que encadenar múltiples solicitudes fuera de mockFoo
, lo que significa que tendré que hacer el encadenamiento en cada prueba.
En primer lugar, no hagas el simulacro de estática. Haz que sea un campo privado. Simplemente ponga su clase setUp en @Before
not not @BeforeClass
. Podría correr un montón, pero es barato.
En segundo lugar, la forma en que lo tienes ahora es la forma correcta de obtener un simulacro para devolver algo diferente dependiendo de la prueba.
Para cualquier persona que use spy () y doReturn () en lugar del método when ():
lo que necesita para devolver diferentes objetos en diferentes llamadas es esto:
doReturn(obj1).doReturn(obj2).when(this.client).someMethod();
También puede anunciar llamadas consecutivas (n. ° 10 en 2.8.9 api). En este caso, utilizaría múltiples llamadas thenReturn o una llamada a continuación Return con múltiples parámetros (varargs).
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
public class TestClass {
private Foo mockFoo;
@Before
public void setup() {
setupFoo();
}
@Test
public void testFoo() {
TestObject testObj = new TestObject(mockFoo);
assertEquals(0, testObj.bar());
assertEquals(1, testObj.bar());
assertEquals(-1, testObj.bar());
assertEquals(-1, testObj.bar());
}
private void setupFoo() {
mockFoo = mock(Foo.class);
when(mockFoo.someMethod())
.thenReturn(0)
.thenReturn(1)
.thenReturn(-1); //any subsequent call will return -1
// Or a bit shorter with varargs:
when(mockFoo.someMethod())
.thenReturn(0, 1, -1); //any subsequent call will return -1
}
}