当有问题的方法有多个预期异常时如何测试单个异常

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 种类型 例外情况(FileNotFoundExceptionSAXExceptionJAXBException) 在你的 getSAXSource 方法中处理, 并验证所有这些都会导致 FileParsingException.