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 所以我假设你正在检查错误的文档。
在 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 所以我假设你正在检查错误的文档。