Как реализовать покрытие кода jacoco в модульном тестировании Spock для общего блока catch 'Exception'?

У меня есть API-интерфейс springboot rest, который выполняет операцию «Выбрать» в базе данных на основе «studentId» типа «String». Ниже я смоделировал сценарий на примере студента.

Я написал 2 модульных теста (с использованием spock и junit mockito) для проверки функциональности. (Код модульного теста, который я не упомянул в этом вопросе, надеясь, что он не потребуется)

юнит-тесты -

  1. Вызов API с действительным идентификатором studentId, для которого существует запись в базе данных Этот модульный тест проверяет функциональность, написанную в блоке try {} (часть else)

  2. Вызов API с недопустимым идентификатором студента. В базе данных нет записи для этого студенческого идентификатора. Этот модульный тест проверяет функциональность, написанную в блоке try {} (если условие), а затем переходит в блок catch (NoDataFoundException).

Я также реализовал jacoco для измерения покрытия кода. Проблема в том, что jacoco покрывает весь код и отмечает его зеленым, за исключением блока catch (Exception). Причина довольно очевидна: я не предоставил ни одного модульного теста для покрытия блока catch (Exception). Проблема в том, что я не мог придумать ни одного сценария, который может вызвать «исключение». все же я хотел бы сохранить в своем коде уловку (исключение), чтобы улавливать любые непредсказуемые исключения

Некоторые люди могут возразить, что у меня не должно быть улова (исключение), и они могут быть правы в своих рассуждениях, но это важно, по крайней мере, по характеру проекта, над которым я работаю, это действительно так.

Кто-нибудь сталкивался с такой ситуацией? Что вы сделали, чтобы скрыть ловушку (исключение) в отчете о покрытии кода jacoco. Любые советы, указатели были бы очень признательны.

Ниже приведен класс контроллера.

@RestController
public class ApiController {

    @Autowired
    StudentInfoRepository studentInfo; // StudentInfoRepository is Interface having method 'fetchStudentDetails'. This method is provided implementation in a class named 'StudentInfoImplementation'

    @RequestMapping(value = "/students/{studentId}", produces = "application/json", method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<Object> getStudentInfo(@PathVariable("studentId") String studentId) throws Exception {

    Result<StudentModelClass> studentList = null;
    ResponseEntity<Object> response = null;
    try {
        studentList = studentInfo.fetchStudentDetails(studentId);
        //if no records are returned for given studentId then throw custom 'NoDataFoundException'
        if (studentList.isExhausted()) {
            throw new NoDataFoundException("No record found for the requested studentId: " + studentid);

        //if records are returned for the given studentId then return 200 response and list of records
        } else {
            response = new ResponseEntity<Object>(studentList.all(), HttpStatus.OK);
            return response;
        }
    } 

    catch(NoDataFoundException ex){
        throw new NoDataFoundException(ex.getMessage());
    } 

    catch(Exception ex){
        throw new Exception(ex);
    }
}

}

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
648
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ограничение Jacoco, как указано в часто задаваемые вопросы

Source code lines with exceptions show no coverage. Why?

JaCoCo determines code execution with so called probes. Probes are inserted into the control flow at certain positions. Code is considered as executed when a subsequent probe has been executed. In case of exceptions such a sequence of instructions is aborted somewhere in the middle and the corresponding line of source code is not marked as covered.

Спасибо Леонарду за ответ! Теперь кажется, что нет другого выхода, кроме как жить с меньшим охватом кода. В любом случае, спасибо, что указали, что это проблема с jacoco, иначе мне пришлось бы копать больше, чтобы найти рабочее решение.

Ajay Singh 20.09.2018 07:39

Да, я знаю, что меня это тоже беспокоит, но они реализовали это именно так. @MaFiA не могли бы вы принять ответ?

Leonard Brünings 20.09.2018 14:56

Другие вопросы по теме