Почему методы Spring @Service появляются с 0% -ным покрытием кода в JaCoCo? - PullRequest
0 голосов
/ 27 декабря 2018

Загружаются эти библиотеки:

  • JUnit 5.3.2
  • JaCoCo 0.8.2
  • Mockito 2.10.0

Только элемент "static {...}" отображается со 100% покрытием.Все остальное в 0%:

JaCoCo report

Класс модульного тестирования имеет аннотации @ExtendWith(SpringExtension.class) и @AutoConfigureMockMvc.Служба вводится с @Mock.

doReturn(actual).when(service).get(param);
when(service.get(param)).thenReturn(actual);

expected = service.get(param);
verify(service, times(1)).get(param);

assertEquals(expected, actual);
assertEquals(actual, expected);

Мой класс ServiceImpl становится красным, когда я нажимаю любой метод.Это расширяет абстрактный класс.ObjectMapper Джексона - красный, а также целые строки в методах.Например:

public CustomReturnObject get(final CustomParamObject paramObject) {
    try {
        return retryTemplate.execute(status -> {
            String json = repository.get(paramObject);
            CustomReturnObject returnObject = json2CustomObject(json, paramObject);

            if (returnObject == null) {
                returnObject = new CustomReturnObject();
                returnObject.setId(paramObject.getId());
            }

            return returnObject;
        });
    } catch (Exception ex) {
        log.error(ex.getMessage(), ex);
        return null;
    }
}

1 Ответ

0 голосов
/ 27 декабря 2018

Аналогично https://stackoverflow.com/a/46614216/244993 давайте оставим в стороне Spring, потому что в IMO явно что-то не так с вашими ожиданиями / пониманием главной вещи здесь - насмешек.

By

doReturn(actual).when(service).get(param);
expected = service.get(param);
verify(service, times(1)).get(param);
assertEquals(expected, actual);

вы не тестируете метод get, вы тестируете что-то, что всегда возвращает actual, независимо от того, что на самом деле написано в get, потому что в этом случае оно не выполняется.

Вот завершено пример в качестве доказательства:

src/main/java/hello/GreetingService.java:

package hello;

class GreetingService {

  Object get(Object param) {
    throw new UnsupportedOperationException();
  }

}

src/test/java/hello/GreetingServiceTest.java:

package hello;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;

@ExtendWith(MockitoExtension.class)
public class GreetingServiceTest {

  @Mock
  public GreetingService service;

  @Test
  void test() {
    Object param = new Object();
    Object actual = new Object();

    doReturn(actual).when(service).get(param);
    Object expected = service.get(param);
    verify(service, Mockito.times(1)).get(param);
    assertEquals(expected, actual);
  }

}

build.gradle:

apply plugin: 'java'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile 'org.mockito:mockito-junit-jupiter:2.23.4'
}

Реальный метод get выдает UnsupportedOperationException, однако приведенный выше тест завершается успешно, поэтому реальный метод не был выполнен.Как еще один способ доказать, что get не выполнено: установите в нем точку останова и выполните тестирование в режиме отладки из IDE - точка останова не будет достигнута.

Покрытие показывает, что действительно было выполнено, и, следовательно, абсолютно правильно, чтоэто ноль для методов, которые не выполняются.

...