使用JUnit 4.11无法使用ExpectedException捕获UnrecognizedPropertyException

时间:2014-02-12 16:25:52

标签: java testing junit junit4 expected-exception

我写了以下代码:

    @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

但实际上,异常会被正常抛出并且测试失败。

你有什么想法吗?

1 个答案:

答案 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);
  }
}