es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)

Tags:  ,

Answer

  1. Avatar for 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:

    --add-opens java.base/java.lang.reflect=ALL-UNNAMED
    

    Esto abrirá el paquete java.lang.reflect para todos los módulos sin nombre. Añade este argumento a la variable de entorno MAVEN_OPTS, o puedes añadirlo directamente al archivo pom.xml, en la sección build, así:

    <build>
        <plugins>
            <plugin>
                <groupid>org.apache.maven.plugins</groupid>
                <artifactid>maven-surefire-plugin</artifactid>
                <configuration>
                    <argline>--add-opens java.base/java.lang.reflect=ALL-UNNAMED</argline>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    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 objeto Authentication antes de llamar al método init(). Aquí tienes el código corregido:

    @RunWith(MockitoJUnitRunner.class)
    public class SomeClassTest {
    
        @Mock
        private Authentication authentication;
    
        // Nota: también puedes usar la anotación @BeforeEach en lugar del método @Before
        @Before
        public void init() {
            // simula el método authentication.getDetails()
            Mockito.when(authentication.getDetails()).thenReturn(someReturn);
        }
    
        @Test
        public void testSomeMethod() {
            // crea una instancia de SomeClass y llama a algún método
            SomeClass someClass = new SomeClass(authentication);
            // verifica el resultado esperado
            assertEquals(expectedResult, someClass.someMethod());
        }
    }
    

    Asegúrate de tener la importación correcta para la clase MockitoJUnitRunner:

    import org.mockito.junit.MockitoJUnitRunner;
    

Comments are closed.