我正在尝试对解组方法进行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

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

最佳答案

您正在捕获并吞没异常,即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,那么您的测试用例要么是多余的,要么是解决了错误的异常类型。

10-08 10:48