在不同的 JUnit 测试中管理已检查的异常
Managing checked exceptions in different JUnit tests
我正在为我的一个方法编写 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();
}
对于这两个测试用例,我都收到一条错误消息,提示未处理的 InvalidRomanNumberException。仅当我将 throws InvalidRomanNumberException 添加到每个方法定义时,此问题才会解决。但我认为这不是正确的方法。只是想和你们其他人核实一下,这里的标准是什么?我应该如何解决这个未处理的异常消息
因为看起来 InvalidRomanNumberException
是一个已检查的异常,您必须用 try-catch
包围它或声明方法 throws InvalidRomanNumberException
。 JUnit
与否,这是常态。
也就是说,您 expect
将抛出 InvalidRomanNumberException
的测试用例方法应该理想地声明它 throws
一个,因为用 [= 抑制它没有意义11=] 因为你的测试用例会失败。另一方面,您期望不会抛出异常的测试用例方法可以在 convertToInteger
方法周围使用 try-catch
并且无论是否抛出异常,该测试用例都应该有一个 assert
关于 convertToInteger
方法的预期结果。
JUnit 测试用例的最终结果应该是测试通过还是失败。运行时的异常不会指示两者。 JUnit 测试用例不能崩溃。
这感觉更像是 unchecked exception 而不是 checked exception。
回想一下两者之间的区别:已检查的异常意味着可以从中合理恢复的内容,例如丢失的文件或格式错误的 URL。 unchecked/run 时间异常意味着无法恢复,例如除以零。
如果用户输入了无效的罗马数字,说他们可以恢复并重试可能没有意义 - conversion 层不应该对此负责.听起来更像是应该在实例化时决定的事情。
如果您改为让自定义异常扩展 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 单元测试。方法声明是这样的:
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();
}
对于这两个测试用例,我都收到一条错误消息,提示未处理的 InvalidRomanNumberException。仅当我将 throws InvalidRomanNumberException 添加到每个方法定义时,此问题才会解决。但我认为这不是正确的方法。只是想和你们其他人核实一下,这里的标准是什么?我应该如何解决这个未处理的异常消息
因为看起来 InvalidRomanNumberException
是一个已检查的异常,您必须用 try-catch
包围它或声明方法 throws InvalidRomanNumberException
。 JUnit
与否,这是常态。
也就是说,您 expect
将抛出 InvalidRomanNumberException
的测试用例方法应该理想地声明它 throws
一个,因为用 [= 抑制它没有意义11=] 因为你的测试用例会失败。另一方面,您期望不会抛出异常的测试用例方法可以在 convertToInteger
方法周围使用 try-catch
并且无论是否抛出异常,该测试用例都应该有一个 assert
关于 convertToInteger
方法的预期结果。
JUnit 测试用例的最终结果应该是测试通过还是失败。运行时的异常不会指示两者。 JUnit 测试用例不能崩溃。
这感觉更像是 unchecked exception 而不是 checked exception。
回想一下两者之间的区别:已检查的异常意味着可以从中合理恢复的内容,例如丢失的文件或格式错误的 URL。 unchecked/run 时间异常意味着无法恢复,例如除以零。
如果用户输入了无效的罗马数字,说他们可以恢复并重试可能没有意义 - conversion 层不应该对此负责.听起来更像是应该在实例化时决定的事情。
如果您改为让自定义异常扩展 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();
}