Actualizar Mockito operación de acceso reflectante ilegal
Estoy actualizando una biblioteca a Java 11 desde Java 8. Estoy utilizando Maven 3.8.x, Spring Boot 2, Mockito-core 4.2.0. Estoy recibiendo el siguiente mensaje de advertencia:
ADVERTENCIA: Se ha producido una operación de acceso reflexivo ilegal
ADVERTENCIA: Acceso reflexivo ilegal de org.mockito.internal.util.reflection.RefelectionMemberAccessor
Al investigar un poco, encontré algunas posibles soluciones, pero ninguna parece funcionar. He intentado utilizar “–add-opens” en la línea de argumentos, actualizar Mockito de 3.8.0 a 4.2.0, y actualizar Byte Buddy.
Nota: No estoy seguro si utilicé correctamente el argumento “–add-opens”. Estoy un poco confundido acerca de lo que necesita ser “módulo/paquete=VALOR” en mi caso. Pensé que lo tenía correcto, pero no ayudó.
Tengo otros microservicios que heredan esta biblioteca y también utilizan Mockito en las pruebas, y funcionan bien. En esos microservicios, anulamos la versión de Java y actualizamos las dependencias necesarias en el archivo pom de esos proyectos.
- Esto me está dando un puntero nulo, pero no estoy seguro por qué. No estaba obteniendo un puntero nulo en estas pruebas al ejecutar en Java 8 *
Ejemplo de clase de prueba que falla:
@RunWith(MocktioJunitRunner.class)
public class SomeClassTest {
@Mock
private Authentication authentication;
@Before
public void init() {
Mockito.when(authentication.getDetails()).thenReturn(someReturn);
}
}
Excepción:
java.lang.NullPointerException
at java.base/java.lang.reflect.Method.getParameterTypes(Method.java:311)
at org.springframework.security.core.Authentication$MockitoMock$1943314113.getDetails(UnknownSource)
davy.ai
Solución para la advertencia de Operación de Acceso Reflectivo Ilegal
El mensaje de advertencia indica que hay una operación de acceso reflectivo ilegal por parte de
org.mockito.internal.util.reflection.RefelectionMemberAccessor
. Para solucionar este problema, puedes utilizar el argumento JVM--add-opens
con el siguiente valor:Esto abrirá el paquete
java.lang.reflect
para todos los módulos sin nombre. Añade este argumento a la variable de entornoMAVEN_OPTS
, o puedes añadirlo directamente al archivopom.xml
, en la secciónbuild
, así:Solución para la Excepción de Puntero Nulo en SomeClassTest
La excepción de puntero nulo indica que el objeto
authentication
es nulo. Para solucionar este problema, necesitas simular el objetoAuthentication
antes de llamar al métodoinit()
. Aquí tienes el código corregido:Asegúrate de tener la importación correcta para la clase
MockitoJUnitRunner
: