Как реализовать покрытие кода jacoco в модульном тестировании Спока для общего блока «Exception»? - PullRequest
0 голосов
/ 13 сентября 2018

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

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

модульные тесты -

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

  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);
    }
}

}

1 Ответ

0 голосов
/ 15 сентября 2018

Это ограничение Jacoco, как указано в FAQ

Строки исходного кода с исключениями не показывают покрытия. Почему?

JaCoCo определяет выполнение кода с помощью так называемых пробников. Зонды вставляется в поток управления в определенных положениях. Код считается выполненным, когда последующий зонд был выполнен. В в случае исключений такая последовательность инструкций отменяется где-то посередине и соответствующая строка исходного кода не помечен как покрытый.

...