当有问题的方法有多个预期异常时如何测试单个异常
How to test a single exception when method in question has multiple expected exceptions
我有一个方法可以接受文件路径并对该文件进行一些处理。但是如果路径不正确,我想抛出 FileNotFoundException 并从中创建一个测试。
由于我的方法在它的 catch 中抛出了另一个名为 FileParsingException
的异常,我必须在测试方法周围的 throws 或 try catch 中添加它。
如果我想为 FileNotFoundException
创建一个测试,它不会让我和错误输出断言错误为 java.lang.AssertionError: Expected exception: java.io.FileNotFoundException
。我无法删除 FileParsingException
那么我怎样才能添加 FileNotFoundException
测试或者就此而言什么可以是
这是我的方法:
public <T> Object getSAXSource(File xmlFile, Class<T> clazz) throws FileParsingException {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
Unmarshaller um = jaxbContext.createUnmarshaller();
// Disable XXE
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
xmlReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
xmlReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// Read the contents
InputStream is = new FileInputStream(xmlFile);
InputSource inputSource = new InputSource(is);
Source xmlSource = new SAXSource(xmlReader, inputSource);
return um.unmarshal(xmlSource);
} catch (FileNotFoundException | SAXException | JAXBException e) {
LOGGER.error("XmlParsingUtil:getSAXSource():: Error on while parsing::" + e.getMessage());
throw new FileParsingException(e.getMessage(), e);
}
}
这是我尝试创建 JUNIT 的方式
//@Test(expected = FileParsingException.class)
@Test(expected = FileNotFoundException.class)
public void testGetSAXSourceFileNotFound() {
File file = new File(resourcePath + "/Invalid.xml");
try {
util.getSAXSource(file, MyXMLClass.class);
Assert.fail("Exception was expected");
} catch (FileParsingException e) {
e.printStackTrace();
}
}
谁能指导我如何为 catch 块创建 junits。此时任何正在测试的异常都将起作用,因为覆盖率显示未覆盖 catch 块。
看来你想得太复杂了(或者我误解了你的意思)。
由于您希望 getSAXSource
方法抛出 FileParsingException
,
你用 @Test(expected = FileParsingException.class)
注释测试方法。
为了让编译器满意,您需要声明该方法
throws FileParsingException
。
您不需要 try/catch 和 Assert.fail("Exception was expected")
因为 JUnit 会为您完成所有这些工作。
(即,当没有抛出 FileParsingException
时,测试将失败。
当抛出任何其他异常时,它也会失败。)
所以你最终得到了一个非常简单的测试方法:
@Test(expected = FileParsingException.class)
public void testGetSAXSourceFileNotFound() throws FileParsingException {
File file = new File(resourcePath + "/Invalid.xml");
util.getSAXSource(file, MyXMLClass.class);
}
可能您需要 3 个不同的测试用例,以测试所有 3 种类型
例外情况(FileNotFoundException
、SAXException
、JAXBException
)
在你的 getSAXSource
方法中处理,
并验证所有这些都会导致 FileParsingException
.
我有一个方法可以接受文件路径并对该文件进行一些处理。但是如果路径不正确,我想抛出 FileNotFoundException 并从中创建一个测试。
由于我的方法在它的 catch 中抛出了另一个名为 FileParsingException
的异常,我必须在测试方法周围的 throws 或 try catch 中添加它。
如果我想为 FileNotFoundException
创建一个测试,它不会让我和错误输出断言错误为 java.lang.AssertionError: Expected exception: java.io.FileNotFoundException
。我无法删除 FileParsingException
那么我怎样才能添加 FileNotFoundException
测试或者就此而言什么可以是
这是我的方法:
public <T> Object getSAXSource(File xmlFile, Class<T> clazz) throws FileParsingException {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
Unmarshaller um = jaxbContext.createUnmarshaller();
// Disable XXE
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
xmlReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
xmlReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// Read the contents
InputStream is = new FileInputStream(xmlFile);
InputSource inputSource = new InputSource(is);
Source xmlSource = new SAXSource(xmlReader, inputSource);
return um.unmarshal(xmlSource);
} catch (FileNotFoundException | SAXException | JAXBException e) {
LOGGER.error("XmlParsingUtil:getSAXSource():: Error on while parsing::" + e.getMessage());
throw new FileParsingException(e.getMessage(), e);
}
}
这是我尝试创建 JUNIT 的方式
//@Test(expected = FileParsingException.class)
@Test(expected = FileNotFoundException.class)
public void testGetSAXSourceFileNotFound() {
File file = new File(resourcePath + "/Invalid.xml");
try {
util.getSAXSource(file, MyXMLClass.class);
Assert.fail("Exception was expected");
} catch (FileParsingException e) {
e.printStackTrace();
}
}
谁能指导我如何为 catch 块创建 junits。此时任何正在测试的异常都将起作用,因为覆盖率显示未覆盖 catch 块。
看来你想得太复杂了(或者我误解了你的意思)。
由于您希望 getSAXSource
方法抛出 FileParsingException
,
你用 @Test(expected = FileParsingException.class)
注释测试方法。
为了让编译器满意,您需要声明该方法
throws FileParsingException
。
您不需要 try/catch 和 Assert.fail("Exception was expected")
因为 JUnit 会为您完成所有这些工作。
(即,当没有抛出 FileParsingException
时,测试将失败。
当抛出任何其他异常时,它也会失败。)
所以你最终得到了一个非常简单的测试方法:
@Test(expected = FileParsingException.class)
public void testGetSAXSourceFileNotFound() throws FileParsingException {
File file = new File(resourcePath + "/Invalid.xml");
util.getSAXSource(file, MyXMLClass.class);
}
可能您需要 3 个不同的测试用例,以测试所有 3 种类型
例外情况(FileNotFoundException
、SAXException
、JAXBException
)
在你的 getSAXSource
方法中处理,
并验证所有这些都会导致 FileParsingException
.