【问题标题】:Junit test java.lang.NullPointerException for Map<String, List<String>>用于 Map<String, List<String>> 的 Junit 测试 java.lang.NullPointerException
【发布时间】:2018-07-30 18:49:26
【问题描述】:

我正在尝试对具有以下功能的类进行单元测试:

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

我得到一个分组的空指针异常。 (在 MetricsSerializer 类的“addGroupings”中)我尝试记录分组,它可以为空。对于场景和过滤器,我添加了值。对于可以为空的分组,我该如何处理? 任何有关如何解决此问题的帮助将不胜感激。

【问题讨论】:

  • 异常发生在哪里?
  • @NickPredey - 编辑了我的问题。我得到了“MetricsSerializer.addGroupings”的例外。但是如果实际值为空怎么办?如何在这里处理空值?

标签: java unit-testing exception junit mockito


【解决方案1】:

我不确定我是否理解您的问题。 MetricsSerializer 是否在您的控制之下?如果是这样,那么您需要进行防御性检查以处理分组为空的情况。

如果它不在你的控制范围内,那么你需要像这样使用一个空组(而不是 null)来构建你的查询

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

【讨论】:

  • 它在我的控制之下。我添加了 if(groupings == null) return;现在它已经解决了。但我仍然收到一个断言错误。实际输出只是由制表符分隔的参数,但由于 "abc \t pqr" ,我得到的输出在值之间有空格和制表符。所以值后面有一个空格,然后是一个制表符,然后是一个空格,然后是下一个值,而不是 value, tab, value。
  • 不要以为你会得到你发布的代码所描述的内容。例如,字符串“one”和“two”将连接在一起,中间没有任何内容。您确定发布的代码是最新的吗?
猜你喜欢
  • 2019-05-27
  • 2020-02-21
  • 2020-08-01
  • 1970-01-01
  • 2018-09-22
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多