Я пытаюсь выполнить модульное тестирование класса, имеющего следующую функцию:
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. Для сценариев и фильтров я добавил значения. Как мне справиться с этим для групп, где он может быть нулевым? Любая помощь относительно того, как это исправить, будет принята с благодарностью.
@NickPredey - Отредактировал свой вопрос. Я получаю исключение для MetricsSerializer.addGroupings. Но что, если фактическое значение равно нулю? Как я могу здесь обрабатывать нулевые значения?




Я не уверен, что понимаю вашу проблему. Под вашим контролем MetricsSerializer? Если это так, то вам нужно сделать защиту нулевой проверкой для обработки случая, когда группировка равна нулю.
Если это находится вне вашего контроля, вам нужно создать свой запрос с пустой группой (а не с нулевым значением), как это
queryParams = QueryParams.builder().withGroupings(new HashMap<String,List<String>>()).build();
Это под моим контролем. Я добавил if (groupings == null) return; и теперь это решено. Но я все еще получаю сообщение об ошибке. Фактический вывод - это просто параметры, разделенные табуляцией, но вывод, который я получаю, имеет пробелы и табуляцию между значениями из-за "abc \ t pqr". Таким образом, после значения идет пробел, затем табуляция, затем пробел, а затем следующее значение вместо value, tab, value.
Не думайте, что вы получите то, что описали, с опубликованным кодом. Например, строки «один» и «два» будут соединены без ничего между ними. Вы уверены, что опубликованный код актуален?
Где происходит исключение?