4

我正在为我的一种方法编写 Java 单元测试。方法声明是这样的:

public int convertToInteger() throws InvalidRomanNumberException
{
    int result=0;
    BaseRomanNumeral num1, num2; 
    int i=0;
    if(!validOperation())
        throw new InvalidRomanNumberException();
}

现在我正在尝试编写两个单元测试。一种是测试是否抛出了正确的异常。另一个是确保写入转换发生。这就是我的测试用例的样子

@Test
public void testRomanNumberConversion() {
    String romanValue="MCMII";
    RomanNumber num=new RomanNumber(romanValue);
    assertEquals(1903,num.convertToInteger());  
}

@Test(expected = InvalidRomanNumberException.class)
public void testInvalidRomanNumberExceptionThrown()  {
    String romanValue="MCMIIII";
    RomanNumber num=new RomanNumber(romanValue);
    num.convertToInteger(); 
}

对于这两个测试用例,我都收到一条错误消息:Unhandled InvalidRomanNumberException。仅当我将 throws InvalidRomanNumberException 添加到每个方法定义时才能解决此问题。但我认为这不是正确的方法。只是想和你们其他人核实一下,这里的标准是什么?我应该如何解决这个未处理的异常消息

4

2 回答 2

5

由于它看起来像是InvalidRomanNumberException一个已检查的异常,因此您必须用 a 包围它try-catch或声明该方法throws InvalidRomanNumberExceptionJUnit与否,这是常态。

expect话虽如此,理想情况下,您将抛出 a的测试用例方法InvalidRomanNumberException应该声明它是throws一个,因为没有必要用 a 来抑制它,try-catch因为您的测试用例将失败。另一方面,您期望不会抛出异常的测试用例方法可以try-catch在方法周围使用a,convertToInteger并且无论是否抛出异常,该测试用例都应该具有方法assert的预期结果convertToInteger

JUnit 测试用例的最终结果应该是测试是通过还是失败。运行时的异常不会表明两者都没有。JUnit 测试用例不能崩溃。

于 2015-05-01T08:24:58.213 回答
4

这感觉更像是一个未经检查的异常,而不是一个已检查的异常。

回想一下两者之间的区别:已检查异常意味着可以合理地从中恢复,例如丢失的文件或格式错误的 URL。未经检查/运行时异常意味着无法恢复,例如除以零。

如果用户输入了无效的罗马数字,说他们可以恢复并重试可能没有意义——转换层不应该对此负责。这听起来更像是在实例化时决定的事情。

如果您改为让您的自定义异常 extend RuntimeException,那么您不需要声明它被抛出(如果您这样做了,它不会有任何影响),并且您不必在测试中处理它。

另一种方法是声明它在你的测试中被抛出。这样做的好处是允许您将这些异常保持为已检查状态,并确保测试不会抱怨您未处理未捕获或未抛出的潜在异常。

@Test
public void testRomanNumberConversion() throws InvalidRomanNumberException {
    String romanValue = "MCMII";
    RomanNumber num = new RomanNumber(romanValue);
    assertEquals(1903, num.convertToInteger());  
}

@Test(expected = InvalidRomanNumberException.class)
public void testInvalidRomanNumberExceptionThrown() throws InvalidRomanNumberException {
    String romanValue = "MCMIIII";
    RomanNumber num = new RomanNumber(romanValue);
    num.convertToInteger(); 
}
于 2015-05-01T08:38:08.507 回答