在JUnit测试中强制执行JAXBException

时间:2019-03-06 17:14:34

标签: java exception junit

我正在尝试对解组方法进行JUnit异常测试。

这是我的解组方法(请注意:由于正常测试会使用预期的字符串进行解组测试,因此我返回了String)。

public String UnMarshalling(String FILE)
{
    ArrayList<Player> playerList = new ArrayList<Player>();
    try {
        JAXBContext context = JAXBContext.newInstance(Match.class);
        Unmarshaller um = context.createUnmarshaller();
        Match Match2 = (Match) um.unmarshal(new InputStreamReader(new FileInputStream(FILE), StandardCharsets.UTF_8));
        playerList = Match2.playerList;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (JAXBException e) {
        e.printStackTrace();
    }

    return playerList.toString();
}

这是此方法的测试

@Test
public void unMarshallingTest() {
    assertTrue(marshalling.UnMarshalling(matchxml).contains("Petras"));
}

@Test(expected=JAXBException.class)
public void marshallingTestException()
{
        marshalling.UnMarshalling(matchbrokenxml);    
}

我要实现的目标是发送损坏的xml,例如,使用错误版本的xml并获取JAXBException

到目前为止,我仅以互联网为例进行搜索,但没有发现任何问题。关于如何实现这一目标的任何建议?

1 个答案:

答案 0 :(得分:0)

您正在捕获并吞没异常,即UnMarshalling()永远不会抛出JAXBException(或该异常的任何子类)。

这将起作用:

public String UnMarshalling(String FILE) throws JAXBException {
    ArrayList<Player> playerList = new ArrayList<Player>();
    try {
        JAXBContext context = JAXBContext.newInstance(Match.class);
        Unmarshaller um = context.createUnmarshaller();
        Match Match2 = (Match) um.unmarshal(new InputStreamReader(new FileInputStream(FILE), StandardCharsets.UTF_8));
        playerList = Match2.playerList;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } 

    return playerList.toString();
}


@Test(expected=UnmarshalException.class)
public void marshallingTestException() {

    marshalling.UnMarshalling(matchbrokenxml);

}

此处的主要更改是删除JAXBException的catch子句,并将throws JAXBException添加到方法声明中。

您的测试强烈表明,JAXBException是此方法的公共API的一部分,在这种情况下,声明抛出JAXBEception的方法是有意义的。另一方面,如果您真的不希望或不需要方法签名中的JAXBException,那么您的测试用例要么是多余的,要么是解决了错误的异常类型。