Mockito:"Checked exception is invalid for this method" 抛出指定的已检查异常时

Mockito: "Checked exception is invalid for this method" when throwing specified checked exception

在 Whosebug 上有几个关于此的问题,但我认为这种情况有所不同。我正在使用 Java 11 和 Mockito 2.11.0.

这里有一个最小的 JUnit 4 测试用例来演示我的问题:

@Test
public void shouldAllowMocking() throws Exception {
  ObjectMapper objectMapper = mock(ObjectMapper.class);
  when(objectMapper.readValue(anyString(), any(Class.class))).thenThrow(new IOException("the-message"));
}

我正在模拟 Jackson 的 ObjectMapper 的 readValue(String content, Class<T> valueType) 方法的行为 - 文档 here - 文档显示该方法可以抛出 IOException。那么为什么Mockito会报我mock抛出这样的异常无效呢?

有趣的是,如果我将行为更改为抛出 JsonParseException,该方法也可以抛出该行为,那么 Mockito 不会抱怨。

这是因为我无意中也更新了我的 jackson 版本,而较新的版本 (2.11.x) 不再抛出 IOException .

自从版本 2.10 Jackson 删除了 IOException,这是代码的一部分:

@SuppressWarnings("unchecked")
public <T> T readValue(String content, JavaType valueType)
    throws JsonProcessingException, JsonMappingException
{
    _assertNotNull("content", content);
    try { // since 2.10 remove "impossible" IOException as per [databind#1675]
        return (T) _readMapAndClose(_jsonFactory.createParser(content), valueType);
    } catch (JsonProcessingException e) {
        throw e;
    } catch (IOException e) { // shouldn't really happen but being declared need to
        throw JsonMappingException.fromUnexpectedIOE(e);
    }
} 

你在问题中包含的 link 指向 jakson-databind 2.7 所以我假设你正在检查错误的文档。