我写了以下代码:
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void testMappingException() {
exception.expect(ArithmeticException.class);
int x = 1 / 0;
}
一切正常。不幸的是,在这种情况下,它无法正常工作:
ObjectMapper mapper = new ObjectMapper();
void add(String json) {
try {
X x = mapper.readValue(json, X.class); // exception here
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
=============================================== =========
@Before
public void setUpBeforeClass() {
jsonTestExcpetion = "{\"aaa\" : \"bbb\"}";
}
@Test
public void testMappingException() {
MyClass mc = new MyClass();
exception.expect(UnrecognizedPropertyException.class);
myClass.add(jsonTestExcpetion);
}
它应该捕获异常
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException
但实际上,异常会被正常抛出并且测试失败。
你有什么想法吗?
答案 0 :(得分:1)
异常是在add(String)
内捕获的。因此JUnit看不到它,也无法测试它。 (JUnit只看到add
方法抛出的异常。)
如何测试?这种方法只有一个副作用是泄漏到方法之外:它将内容写入System.err
。您可以使用System Rules库进行测试。
但是,通常默默地捕获异常是不好的做法。调用者不知道发生了异常。我建议不要抓住例外:
void add(String json) throws JsonParseException, JsonMappingException, IOException {
X x = mapper.readValue(json, X.class);
return null;
}
然后你的测试就可以了。
如果您不喜欢方法签名中的throws
,则可以使用运行时异常包装异常。
void add(String json) {
try {
X x = mapper.readValue(json, X.class);
return null;
} catch (JsonParseException e) {
throw new RuntimeException(e);
} catch (JsonMappingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}