Saltar al contenido

¿Qué uso en lugar de Whitebox en Mockito 2.2 para establecer campos?

Nuestros desarrolladores estrellas han agotado sus depósitos de café, por su búsqueda noche y día por la resolución, hasta que Esmeralda encontró la solución en Gogs y hoy la compartimos contigo.

Solución:

Si está utilizando Spring (específicamente la biblioteca de prueba de primavera), simplemente puede usar ReflectionTestUtils.setField en lugar de Whitebox.setInternalState

Tenga en cuenta que Whitebox siempre estuvo en el org.mockito.internal paquete. Más allá del incremento del número de versión principal, el internal la designación es un obsequio de que el paquete puede estar sujeto a cambios importantes.

Si desea asegurarse de establecer campos inaccesibles en su prueba, puede hacerlo de la misma manera que setInternalState hace, que es solo para identificar el campo en la jerarquía, llame setAccessible en él, y luego configúrelo. El código completo está aquí en grepcode. También puede examinar otras formas de establecer un estado inaccesible en las pruebas.

public static void setInternalState(Object target, String field, Object value) 
    Class c = target.getClass();
    try 
        Field f = getFieldFromHierarchy(c, field);  // Checks superclasses.
        f.setAccessible(true);
        f.set(target, value);
     catch (Exception e) 
        throw new RuntimeException(
            "Unable to set internal state on a private field. [...]", e);
    

Sin embargo, En situaciones como esta, mi consejo general es deja de pelear con las herramientas: Los cuatro niveles de encapsulación de Java (público, protegido, paquete, privado) no son necesariamente lo suficientemente granulares para expresar el grado de protección que está tratando de expresar y, a menudo, es mucho más fácil agregar un método de inicialización bien documentado o una anulación del constructor para anula las dependencias como intentas hacerlo reflexivamente. Si coloca sus pruebas en el mismo paquete de Java que la clase que prueba, a menudo puede incluso hacer que los campos o el paquete de método/constructor sean privados, lo que también es una buena razón para configurar carpetas de origen paralelas. src y tests (etc) que representan dos mitades del mismo paquete Java.

Aunque algunos tratan este método o constructor adicional como “contaminación de API”, yo lo veo como una codificación según los requisitos de uno de los consumidores más importantes de su clase:su propia prueba. Si necesita una interfaz externa impecable, puede definir fácilmente una por separado de modo que pueda ocultar cualquier detalle que desee. Sin embargo, es posible que te encuentres me gusta la capacidad de inyectar cualquier implementación real o simulada directamente en su componente ahora más flexible, momento en el que es posible que desee buscar patrones o marcos de inyección de dependencia.

Puedes usar FieldSetter en Mockito2.x

    import org.mockito.internal.util.reflection.FieldSetter;
 FieldSetter.setField(eventHandler,eventHandler.getClass().getDeclaredField("securityService"), securityService);

Aquí tienes las comentarios y valoraciones

Si para ti ha resultado provechoso este post, nos gustaría que lo compartas con más desarrolladores de este modo nos ayudas a extender este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *