gpt4 book ai didi

java - 在不同的 JUnit 测试中管理已检查的异常

转载 作者:行者123 更新时间:2023-12-03 22:59:45 25 4
gpt4 key购买 nike

我正在为我的方法之一编写 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 添加到每个方法定义时才会解决此问题。但我认为这不是正确的方法。只是想和你们其他人核实一下,这里的规范是什么?我应该如何解决这个未处理的异常消息

最佳答案

这感觉更像是它应该是一个未经检查的异常,而不是一个受检查的异常。

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

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

如果您改为让您的自定义异常扩展 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();
}

关于java - 在不同的 JUnit 测试中管理已检查的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com