Java:适用于多重错误功能的设计

时间:2014-02-19 09:19:57

标签: java oop unit-testing error-handling

我正在用Java编写一段代码,其工作是解析配置文件。这对最终用户来说很方便,因为他们可以一次查看并修复所有解析错误。但它对测试来说不是很好 - 而不是特定的异常测试函数只是期望非常普遍的ParsingError异常。

这里总是一个黑暗魔法的房间,就像测试私人方法一样,但我不想这样做。你能为这个案例提出更好的设计解决方案吗?

4 个答案:

答案 0 :(得分:1)

为什么不抛出一个InvalidConfigurationException(我不会使用ParsingError - 除了其他任何东西,我不希望这是一个包含信息的Error子类)关于具体问题?该信息不会出现异常,而只是“正常”数据类,表示(比方说)行号和错误类型。

然后,您的测试将捕获异常,并按预期验证内容。

实现可能会从一个空的错误列表开始,并累积它们 - 然后如果列表在解析代码的末尾非空,则抛出一个由错误列表提供的异常。

答案 1 :(得分:1)

我以前来过这里。例外情况不合适。相反,您应该在解析器中提供报告。

parser.parse();
if (parser.hasErrors()) {
    for (ParserError error : parser.getErrors()) {
        // Provide a report to the user somehow
    }
}

简单易读。如果存在异常情况,则应抛出异常 - 例如没有要解析的源数据,不是因为解析器发现了问题。

答案 2 :(得分:0)

为什么不使用链式异常?您可以构建特定的异常(例如ParticularParsingError),然后将其与ParsingError链接并将其抛回。

在您的单元测试中,使用e.getCause(),其中eParsingError

答案 3 :(得分:0)

首先要做的事情:ParsingError似乎是一个奇怪的名字,ParsingException看起来更好(错误是一个不应该被捕获的java.lang类)

您可以在ParsingException中添加一个列表,并在测试中添加一个try-catch块,您可以在其中测试您的列表是否包含您期望的内容。

例如你有:

@Test(expected=ParsingException.class)
public void test_myMethod_myTestCase(){
        myMethod()
}

然后你会:

public void test_myMethod_myTestCase(){
    try {
        myMethod()
    }
    catch(ParsingException pe) {
        if (! pe.list.contains(anError)
            || ! pe.list.contains(anOtherError) ) {
            fail();
        }
    }
}