为什么不管是否抛出异常,这个测试都会成功?
Why does this test succeed regardless whether an exception is thrown or not?
当我删除 try/catch 时它可以工作但无法测试阴性测试
public class TileCombinationSetsTest {
@Test public void testTileCombinations() {
new TileCombinationSets();
assertEquals(TileCombinationSets.tileCombinations(1).size(), 7);
assertEquals(TileCombinationSets.tileCombinations(2).size(), 42);
assertEquals(TileCombinationSets.tileCombinations(3).size(), 210);
assertEquals(TileCombinationSets.tileCombinations(4).size(), 840);
assertEquals(TileCombinationSets.tileCombinations(5).size(), 2520);
assertEquals(TileCombinationSets.tileCombinations(6).size(), 5040);
assertEquals(TileCombinationSets.tileCombinations(7).size(), 5040);
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Throwable e) {}
}
}
我承担这个角色
TileCombinationSets.tileCombinations(4)
第二次执行抛出异常。
您可以打印异常的堆栈跟踪以查看是否抛出异常。
在不知道 TileCombinationSets.tileCombinations(int x) 做什么的情况下很难说。
如果可能的话,你能post方法吗?
在 JUnit 中,当测试方法抛出异常(或其他 Throwable)时测试失败。 JUnit 的测试运行程序捕获异常并将测试报告为失败。另一方面,当测试方法完成而没有抛出异常时,测试运行器认为测试成功。 assertEquals
和 fail
之类的语句抛出 AssertionError.
在你的测试中 fail("Exceptions expected")
抛出了一个 AssertionError。立即被捕获,因此测试方法 testTileCombinations
不会抛出异常。现在对于 JUnit 来说,方法似乎已成功执行,因此它认为测试成功。
如果您想测试 TileCombinationSets.tileCombinations(4)
抛出异常,那么您可以使用 JUnit 的 assertThrows
assertThrows(
Exception.class, // you can be more specific here
() -> TileCombinationSets.tileCombinations(4)
);
如果你想测试 TileCombinationSets.tileCombinations(4)
没有抛出异常,那么你只需执行它。 (如果抛出异常,JUnit 将报告测试失败,否则将报告测试成功。)
@Test
public void testTileCombinations() {
...
TileCombinationSets.tileCombinations(4);
}
您通常不应捕捉 Throwable
,而应捕捉 Exception
。 Throwable
还包括 Error
的子类,它们是关于 Java 运行时环境本身(如 OutOfMemoryError
)的严重错误,程序不应尝试从中恢复,因为它把程序进入未定义状态。
碰巧,在您的示例中 fail()
方法抛出的 AssertionError
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Throwable e) {}
还扩展了 Error
.
因此,将您的代码更改为
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Exception e) {}
它应该按预期运行,只要您的 tileCombinations()
方法抛出的异常仅扩展 Exception
(它们应该这样做,因为自己扩展 Error
是不好的做法).
当我删除 try/catch 时它可以工作但无法测试阴性测试
public class TileCombinationSetsTest {
@Test public void testTileCombinations() {
new TileCombinationSets();
assertEquals(TileCombinationSets.tileCombinations(1).size(), 7);
assertEquals(TileCombinationSets.tileCombinations(2).size(), 42);
assertEquals(TileCombinationSets.tileCombinations(3).size(), 210);
assertEquals(TileCombinationSets.tileCombinations(4).size(), 840);
assertEquals(TileCombinationSets.tileCombinations(5).size(), 2520);
assertEquals(TileCombinationSets.tileCombinations(6).size(), 5040);
assertEquals(TileCombinationSets.tileCombinations(7).size(), 5040);
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Throwable e) {}
}
}
我承担这个角色
TileCombinationSets.tileCombinations(4)
第二次执行抛出异常。 您可以打印异常的堆栈跟踪以查看是否抛出异常。
在不知道 TileCombinationSets.tileCombinations(int x) 做什么的情况下很难说。 如果可能的话,你能post方法吗?
在 JUnit 中,当测试方法抛出异常(或其他 Throwable)时测试失败。 JUnit 的测试运行程序捕获异常并将测试报告为失败。另一方面,当测试方法完成而没有抛出异常时,测试运行器认为测试成功。 assertEquals
和 fail
之类的语句抛出 AssertionError.
在你的测试中 fail("Exceptions expected")
抛出了一个 AssertionError。立即被捕获,因此测试方法 testTileCombinations
不会抛出异常。现在对于 JUnit 来说,方法似乎已成功执行,因此它认为测试成功。
如果您想测试 TileCombinationSets.tileCombinations(4)
抛出异常,那么您可以使用 JUnit 的 assertThrows
assertThrows(
Exception.class, // you can be more specific here
() -> TileCombinationSets.tileCombinations(4)
);
如果你想测试 TileCombinationSets.tileCombinations(4)
没有抛出异常,那么你只需执行它。 (如果抛出异常,JUnit 将报告测试失败,否则将报告测试成功。)
@Test
public void testTileCombinations() {
...
TileCombinationSets.tileCombinations(4);
}
您通常不应捕捉 Throwable
,而应捕捉 Exception
。 Throwable
还包括 Error
的子类,它们是关于 Java 运行时环境本身(如 OutOfMemoryError
)的严重错误,程序不应尝试从中恢复,因为它把程序进入未定义状态。
碰巧,在您的示例中 fail()
方法抛出的 AssertionError
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Throwable e) {}
还扩展了 Error
.
因此,将您的代码更改为
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Exception e) {}
它应该按预期运行,只要您的 tileCombinations()
方法抛出的异常仅扩展 Exception
(它们应该这样做,因为自己扩展 Error
是不好的做法).