Тест Junit java.lang.NullPointerException для Map <String, List <String>>

Я пытаюсь выполнить модульное тестирование класса, имеющего следующую функцию:

  private String getTabSeparateValues(final QueryParams params, final HttpServletRequest request) {
        MetricsSerializer serializer = new MetricsSerializer();
        return serializer.serializeValues(params, request);
    }

Он вызывает функцию serializeValues ​​(params, request) в следующем классе:

public class MetricsSerializer {

    private final StringJoiner stringJoiner = new StringJoiner("\t");
    private static final String MONTH_FORMAT = "MMMMM";

      public String serializeMetrics(final QueryParams queryParams, final HttpServletRequest request) {
        addValueFromString(queryParams.getId());
        addValueFromString(getCurrentMonth());
        addValueFromString(request.getRemoteUser().split("@")[0]);
        addValueFromString(queryParams.getCurrency());
        addValuesFromList(queryParams.getCompanies());
        addValueFromString(queryParams.getCognosDatasetType());
        addValuesFromList(queryParams.getScenarios());
        addFilter(queryParams.getFilters());
        addGroupings(queryParams.getGroupings());
        addValueFromString(queryParams.getReportTemplate());
        return stringJoiner.toString();
    }

    private void addValueFromString(final String value) {
        stringJoiner.add(value);
    }

    private void addFilter(final List<Map<String, List<String>>> filters) {
        List<String> collect = filters.stream()
                .flatMap(entry -> entry.keySet()
                        .stream())
                .collect(Collectors.toList());
        addValuesFromList(collect);
    }

    private void addGroupings(final Map<String, List<String>> groupings) {
        addValuesFromList(new ArrayList<>(groupings.keySet()));
    }

    private void addValuesFromList(final List<String> listValues) {
        stringJoiner.add(listValues.stream().collect(Collectors.joining(" ")));
    }

    private String getCurrentMonth() {
        DateFormat monthFormat = new SimpleDateFormat(MONTH_FORMAT);
        return monthFormat.format(new Date());
    }

}

Этот класс возвращает значения в формате, разделенном табуляцией. Структура класса QueryParams следующая:

@Data
@Builder
public class QueryParams {
    private String datasetType;
    private Map<String, List<String>> groupings;
    private List<Aggregate> aggregates;
    private List<String> scenarios;
    private List<String> companies;
    private List<Map<String, List<String>>> filters;
    private List<NamedTimeRange> timeRanges;
    private Map<String, String> params;
    private String reportTemplate;
    private String id;
    private String currency;
}

Я не использую все параметры в QueryParameters (пропуск временных диапазонов, параметров, агрегатов). Чтобы проверить, действительно ли я получаю метрики, разделенные табуляцией, я написал следующий тест:

public class MetricsHandlerTest {

    private QueryParams queryParams;

    @Before
    public void setUp() throws Exception {
        List<String> list = Arrays.asList("one", "two");
        List<String> scenarioList = Arrays.asList("A1");
    List<Map<String, List<String>>> filter = new ArrayList<>();
    Map<String, List<String>> filtersMap = new HashMap<>();
    List<String> filterList = Arrays.asList("COM");
    filtersMap.put("product", filterList);
    filter.add(filtersMap);
        queryParams = QueryParams.builder()
                .id("123").currency("USD").companies(list).scenarios(scenarioList).filters(filter)
                .build();
    }

    @Test
    public void tabSerializerTest() {
        String remoteUser = "testuser";
        HttpServletRequest httpServletRequest = Mockito.mock(HttpServletRequest.class);
        Mockito.when(httpServletRequest.getRemoteUser())
                .thenReturn(remoteUser);
        MetricsSerializer metricsSerializer = new MetricsSerializer();
        String tabs = metricsSerializer.serializeMetrics(queryParams, httpServletRequest);
        assertEquals(tabs, "123 \t USD \t one two");
    }
}

Я получаю исключение нулевого указателя для группировок. (в "addGroupings" класса MetricsSerializer) Я пробовал регистрировать группировки, и это может быть null. Для сценариев и фильтров я добавил значения. Как мне справиться с этим для групп, где он может быть нулевым? Любая помощь относительно того, как это исправить, будет принята с благодарностью.

Где происходит исключение?

Nick Predey 30.07.2018 23:08

@NickPredey - Отредактировал свой вопрос. Я получаю исключение для MetricsSerializer.addGroupings. Но что, если фактическое значение равно нулю? Как я могу здесь обрабатывать нулевые значения?

Tee Jay 30.07.2018 23:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
576
1

Ответы 1

Я не уверен, что понимаю вашу проблему. Под вашим контролем MetricsSerializer? Если это так, то вам нужно сделать защиту нулевой проверкой для обработки случая, когда группировка равна нулю.

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

queryParams = QueryParams.builder().withGroupings(new HashMap<String,List<String>>()).build();

Это под моим контролем. Я добавил if (groupings == null) return; и теперь это решено. Но я все еще получаю сообщение об ошибке. Фактический вывод - это просто параметры, разделенные табуляцией, но вывод, который я получаю, имеет пробелы и табуляцию между значениями из-за "abc \ t pqr". Таким образом, после значения идет пробел, затем табуляция, затем пробел, а затем следующее значение вместо value, tab, value.

Tee Jay 31.07.2018 00:18

Не думайте, что вы получите то, что описали, с опубликованным кодом. Например, строки «один» и «два» будут соединены без ничего между ними. Вы уверены, что опубликованный код актуален?

DingDong 31.07.2018 04:50

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