【问题标题】:How to throw JsonProcessingException while creating Json from List using Mockito?如何在使用 Mockito 从 List 创建 Json 时抛出 JsonProcessingException?
【发布时间】:2019-05-21 16:00:34
【问题描述】:

我正在尝试对 catch 块进行单元测试,以使用 jackson 将 List 转换为 Json 格式。这是我的代码:

   public String convert(List<POJO> list) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            data = objectMapper.writeValueAsString(list);
        } catch (JsonProcessingException exception) {
            System.out.println("Exception message: {}", exception.getMessage());
        }
        return data;
    }

我尝试过这样的单元测试:

@Mock
ObjectMapper mockObjectMapper;

@Test(expected = JsonProcessingException.class)
public void doThrowException() throws JsonProcessingException {
    doThrow(JsonProcessingException.class).when(mockObjectMapper).writeValueAsString(any());
    dataTransformer.convert(new ArrayList<>());
    verify(mockObjectMapper.writeValueAsString(any()));
}

我一直在努力研究这个单元测试以实现全面覆盖。我查了几篇关于 SO 的文章,但没有运气。由于我是单元测试领域的新手,我有一种感觉,我肯定在这里遗漏了一些东西。

【问题讨论】:

  • 当您在方法中创建新实例时,您无法模拟 objectmapper。需要传入/注入

标签: java json unit-testing exception mockito


【解决方案1】:

1) 您的测试逻辑在实现方面不正确。在实现中,您捕获了异常,因此在异常测试用例中,您永远不会按预期得到它。

2) 如评论中所述,如果从类的客户端代码中看不到依赖项,则无法模拟 ObjectMapper。在这里,它没有任何方法可以模拟课程。您可以添加构造函数或设置器来设置它,但这有意义吗?

3) 实际上你不应该在这里嘲笑。您正在测试的组件将一些列表元素映射到字符串。您不想模拟但要在异常情况和名义情况下测试映射逻辑。否则你的测试不会有很大的价值。
要获得JsonProcessingException,您可以从post 的出色答案中获得启发。

【讨论】:

  • 是的,我明白了。但是在这种情况下我如何测试异常。我不确定什么样的输入会生成JsonProcessingExcetion。有什么指点吗?
  • 我想我通过抛出 JsonProcessingException 解决了覆盖问题。
  • 你是怎么做到的?我更新以回答您的第一条评论。
  • 我现在抛出异常,而不是捕获异常。这里唯一的事情是我必须在调用此方法的所有方法中抛出异常。这样单元测试覆盖率是 100%
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2018-07-02
相关资源
最近更新 更多