Тестовое покрытие абстрактного класса JaCoCoJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Тестовое покрытие абстрактного класса JaCoCo

Сообщение Anonymous »

У меня есть абстрактный класс, который содержит некоторые методы, общие для классов, наследующих эти методы. В общем, этот абстрактный класс фильтрует параметры запроса по запросам, после чего они обрабатываются конкретной реализацией. Допустим, абстрактный класс содержит метод, который выглядит следующим образом:

Код: Выделить всё

public class HandlerAbstract {

protected String getUserName(NativeWebRequest request, @Valid RequestBodyOptions requestBodyOptions) throws HandlerException {
String requestBodyOptionsUserName = null;
String requestParameterUserName = request.getParameter("username");

if (requestBodyOptions != null) {
requestBodyOptionsUserName = requestBodyOptions.getUserName();
}

if (requestBodyOptionsUserName != null && requestParameterUserName == null) {
return requestBodyOptionsUserName;
} else if (requestBodyOptionsUserName == null && requestParameterUserName != null) {
return requestParameterUserName;
} else if (requestBodyOptionsUserName != null && requestParameterUserName != null && !(requestBodyOptionsUserName.equals(requestBodyOptionsUserName))) {
throw new HandlerException("The username passed in the request body and the request parameters are not the same.");
} else if (requestBodyOptionsUserName != null && requestParameterUserName != null && requestBodyOptionsUserName.equals(requestBodyOptionsUserName)) {
return requestBodyOptionsUserName;
}else{
return null;
}
}

}
У меня есть следующие тесты:

Код: Выделить всё

@Test
public void testUserNameBody(){
HashMap parameters = new HashMap();

NativeWebRequest mockRequest = getNativeWebRequest(parameters);

RequestBodyOptions requestBodyOptions = new RequestBodyOptions();
requestBodyOptions.setUserName("user-name");

HandlerAbstract handlerImplementation = new HandlerImplementation();

String userName = handlerImplementation.getUserName(mockRequest, options);

Assertions.assertEquals("user-name", userName);
}

@Test
public void testUserNameRequestParameter(){
HashMap parameters = new HashMap();
parameters.put("username", "user-name");

NativeWebRequest mockRequest = getNativeWebRequest(parameters);

RequestBodyOptions requestBodyOptions = new RequestBodyOptions();

HandlerAbstract handlerImplementation = new HandlerImplementation();

String userName = handlerImplementation.getUserName(mockRequest, options);

Assertions.assertEquals("user-name", userName);
}

@Test
public void testUserName2DifferentValues(){
HashMap parameters = new HashMap();
parameters.put("username", "user-name");

NativeWebRequest mockRequest = getNativeWebRequest(parameters);

RequestBodyOptions requestBodyOptions = new RequestBodyOptions();
requestBodyOptions.setUserName("somethingelse");

try{
HandlerAbstract handlerImplementation = new HandlerImplementation();
String tokenSecret = handlerImplementation.getUserName(mockRequest, options);
Assertions.fail("Should have thrown an exception but did not throw any exception");
}catch (HandlerException e){
Assertions.assertEquals("The username passed in the request body and the request parameters are not the same.", e.getMessage());
}catch (Exception e){
Assertions.fail("Should have thrown a HandlerException but threw: " + e.getMessage());
}
}

@Test
public void testUserNameEqualValues(){
HashMap parameters = new HashMap();
parameters.put("username", "user-name");

NativeWebRequest mockRequest = getNativeWebRequest(parameters);

RequestBodyOptions requestBodyOptions = new RequestBodyOptions();
requestBodyOptions.setUserName("user-name");

HandlerAbstract handlerImplementation = new HandlerImplementation();

String userName = handlerImplementation.getUserName(mockRequest, options);

Assertions.assertEquals("user-name", userName);
}
Проблема в том, что когда я запускаю тесты и проверяю отчет о покрытии кода с помощью jacoco, jacoco сообщает мне, что тестами покрывается только та точка метода, в которой произошло исключение. Все остальные операторы возврата помечены как не охваченные.
Если я добавляю журнал или исключение в разные точки, где он должен возвращать значение, он выдается/записывается во время работы. тесты. То же самое, если я запущу его с покрытием кода Intelij. Если я запускаю эти тесты с отладкой, все строки будут покрыты.
Сначала я думал, что это из-за использования Mockito, но поэтому я создал NativeWebRequest вот так, но он не решается это:

Код: Выделить всё

    private NativeWebRequest getNativeWebRequest(HashMap parameters){
MockHttpServletRequest httpRequest = new MockHttpServletRequest();

// Add parameters to the request
parameters.forEach((key, value) -> {
httpRequest.addParameter(key, value);
});

NativeWebRequest nativeWebRequest = new ServletWebRequest(httpRequest);

return nativeWebRequest;
}
  • Затем я попытался явно установить для параметра запроса значение null в запросе или в параметрах тела запроса, но это также не помогло.
  • Я создал новую конкретную реализацию абстрактного класса в тесте, так как думал, что, возможно, именно здесь Жакоко запутался, но это не помогло. >
  • Я дважды проверил, правильно ли настроен мой плагин Surefire и это. Тесты, которые я хочу использовать для улучшения тестового покрытия, выполняются (https://stackoverflow.com/a/67220369/12171869).
  • Я работаю над многомодульным проектом с модуль для интеграционных тестов. Я исключил покрытие интеграционного теста из создания отчета jacoco, полагая, что проблема связана с созданием агрегированного отчета. Однако метод остается не полностью раскрытым.
Короче: я хочу получить полное тестовое покрытие, но, похоже, делаю это неправильно, что приводит к Жакоко считает, что этот метод не полностью описан.


Подробнее здесь: https://stackoverflow.com/questions/792 ... t-coverage
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»