我正在尝试对解组方法进行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
。
到目前为止,我仅以互联网为例进行搜索,但没有发现任何问题。关于如何实现这一目标的任何建议?
答案 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
,那么您的测试用例要么是多余的,要么是解决了错误的异常类型。