java - test - mockito maven
Usando Mockito para simular una variable local de un método (2)
La mejor manera de resolver este problema es usar un servicio de Clock
inyectado, que se utiliza para obtener nuevas instancias de DateTime. De esa manera, su prueba puede inyectar un reloj simulado, que devuelve un DateTime específico en lugar de la hora actual.
Tenga en cuenta que la nueva API de tiempo de Java 8 define dicha clase de Reloj , específicamente para ese propósito.
Tengo una clase A
que necesita para la prueba. La siguiente es la definición de A
:
public class A {
public void methodOne(int argument) {
//some operations
methodTwo(int argument);
//some operations
}
private void methodTwo(int argument) {
DateTime dateTime = new DateTime();
//use dateTime to perform some operations
}
}
Y en función del valor de fecha y dateTime
, algunos datos se manipularán y se recuperarán de la base de datos. Para esta base de datos, los valores se conservan a través de un archivo JSON.
Esto complica las cosas. Lo que necesito es configurar el dateTime
en una fecha específica mientras se está probando. ¿Hay alguna manera de que pueda simular el valor de una variable local usando mockito?
No puedes burlarte de una variable local. Sin embargo, lo que podría hacer es extraer su creación a un método protected
y spy
:
public class A {
public void methodOne(int argument) {
//some operations
methodTwo(int argument);
//some operations
}
private void methodTwo(int argument) {
DateTime dateTime = createDateTime();
//use dateTime to perform some operations
}
protected DateTime createDateTime() {
return new DateTime();
}
}
public class ATest {
@Test
public void testMethodOne() {
DateTime dt = new DateTime (/* some known parameters... */);
A a = Mockito.spy(new A());
doReturn(dt).when(a).createDateTime();
int arg = 0; // Or some meaningful value...
a.methodOne(arg);
// assert the result
}