¿Cómo puedo simular una variable de campo que se inicializa en línea?
class Test {
private Person person = new Person();
...
public void testMethod() {
person.someMethod();
...
}
}
Aquí quiero simular person.someMethod()
mientras pruebo el Test.testMethod()
método para el que necesito simular la inicialización de la person
variable. ¿Cualquier pista?
Editar: no puedo modificar la clase Person.
java
mockito
junit4
powermockito
Arun
fuente
fuente
Person
. Las opciones incluyen agregar un constructor para hacer esto o agregar un método setter.Respuestas:
Mockito viene con una clase de ayuda para ahorrarle un código de placa de caldera de reflexión:
Actualización: Desafortunadamente, el equipo de mockito decidió eliminar la clase en Mockito 2. Así que vuelve a escribir su propio código repetitivo de reflexión, usa otra biblioteca (por ejemplo, Apache Commons Lang ) o simplemente roba la clase Whitebox (tiene licencia del MIT ).
Actualización 2: JUnit 5 viene con sus propias clases ReflectionSupport y AnnotationSupport que pueden ser útiles y evitar que tenga que utilizar otra biblioteca.
fuente
internal
paquete y parece que ya no funciona en Mockito 2.6.2.Bastante tarde para la fiesta, pero me golpearon aquí y recibí ayuda de un amigo. La cosa era no usar PowerMock. Esto funciona con la última versión de Mockito.
Mockito viene con esto
org.mockito.internal.util.reflection.FieldSetter
.Básicamente, lo que hace es ayudarlo a modificar los campos privados mediante la reflexión.
Así es como se usa:
De esta manera puede pasar un objeto simulado y luego verificarlo más tarde.
Aquí está la referencia.
fuente
FieldSetter
ya no está disponible en Mockito 2.x.Class#getDeclaredField
acepta un solo parámetro, por lo que los parens deben verse asíFieldSetter.setField(underTest, underTest.getClass().getDeclaredField("person"), mockedPerson);
. Así fue como me equivoqué y pensé que podría ser una buena idea arreglarlo en tu ejemplo. Gracias por responder.En caso de que use Spring Test, pruebe org.springframework.test.util.ReflectionTestUtils
fuente
testImplementation("org.springframework:spring-test:5.1.2.RELEASE")
Ya encontré la solución a este problema que olvidé publicar aquí.
Los puntos clave de esta solución son:
Ejecutando mis casos de prueba con PowerMockRunner:
@RunWith(PowerMockRunner.class)
Instruya a Powermock para que se prepare
Test.class
para la manipulación de campos privados:@PrepareForTest({ Test.class })
Y finalmente burlarse del constructor para la clase Person:
PowerMockito.mockStatic(Person.class);
PowerMockito.whenNew(Person.class).withNoArguments().thenReturn(person);
fuente
mockStatic
función, pero eso no está representado en su ejemplo de código. ¿Debería el ejemplo de código tener lamockStatic
llamada o no es necesario para los constructores?El siguiente código se puede utilizar para inicializar el asignador en la simulación del cliente REST. El
mapper
campo es privado y debe configurarse durante la configuración de la prueba unitaria.fuente
Usando la guía de @ Jarda, puede definir esto si necesita configurar la variable con el mismo valor para todas las pruebas:
Pero tenga en cuenta que la configuración de valores privados para que sean diferentes debe manejarse con cuidado. Si son privados lo son por alguna razón.
Por ejemplo, lo uso, por ejemplo, para cambiar el tiempo de espera de un sueño en las pruebas unitarias. En ejemplos reales, quiero dormir durante 10 segundos, pero en la prueba unitaria estoy satisfecho si es inmediato. En las pruebas de integración, debe probar el valor real.
fuente