我正在尝试对解组方法进行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
,那么您的测试用例要么是多余的,要么是解决了错误的异常类型。