我正在用Java编写一段代码,其工作是解析配置文件。这对最终用户来说很方便,因为他们可以一次查看并修复所有解析错误。但它对测试来说不是很好 - 而不是特定的异常测试函数只是期望非常普遍的ParsingError异常。
这里总是一个黑暗魔法的房间,就像测试私人方法一样,但我不想这样做。你能为这个案例提出更好的设计解决方案吗?
答案 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()
,其中e
是ParsingError
。
答案 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();
}
}
}