No se puede unidad de prueba de Java utiliza el código de reflexión con Mockito ni PowerMockito

Frighi:

Estoy tratando de escribir una prueba unitaria para probar esta pieza de código, pero yo intento fallido en límites Mockito / Powermockito con clase nativa java.lang.Class como se explica aquí .

¿Cómo podría probar esto:

Method[] serverStatusMethods = serverStatus.getClass().getMethods();
    for (Method serverStatusMethod : serverStatusMethods) {
        if (serverStatusMethod.getName().equalsIgnoreCase("get" + field)) {
            serverStatusMethod.setAccessible(true);
            try {
                Number value = (Number) serverStatusMethod.invoke(serverStatus);
                response = new DataResponse(field + " value", value);
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
                Logger.getLogger(StatusServlet.class.getName()).log(Level.SEVERE, null, ex);
                response = new ErrorResponse(HttpStatus.Code.INTERNAL_SERVER_ERROR, ex);
            }
            break;
        }
    }

para lanzar excepciones esta forma intencionada en caso de prueba:

catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
            Logger.getLogger(StatusServlet.class.getName()).log(Level.SEVERE, null, ex);
            response = new ErrorResponse(HttpStatus.Code.INTERNAL_SERVER_ERROR, ex);
}
Torben:

Haz lo que haces siempre burlándose de una clase es demasiado difícil: agrega otra capa de abstracción. Ej extraer las operaciones reflectantes en un método separado:

public Number resolveServerStatus(Object serverStatus)
    throws IllegalAccessException, IllegalArgumentException,
        InvocationTargetException {

    Method[] serverStatusMethods = serverStatus.getClass().getMethods();
    for (Method serverStatusMethod : serverStatusMethods) {
        if (serverStatusMethod.getName().equalsIgnoreCase("get" + field)) {
            serverStatusMethod.setAccessible(true);
            return (Number) serverStatusMethod.invoke(serverStatus);
        }
    }
}

Ahora burlarse del resolveServerStatusmétodo.

Esto es lo que debería haber hecho en primer lugar si se hubiera seguido el principio de la responsabilidad individual . Su método tenía dos responsabilidades: resolver el número de estado y convertirlo en DataResponseobjeto. Las múltiples responsabilidades hicieron probar el método dififficult.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=363223&siteId=1
Recomendado
Clasificación