Java 为什么不管是否引发异常,此测试都会成功?
当我删除try/catch时,它可以工作,但无法测试阴性测试Java 为什么不管是否引发异常,此测试都会成功?,java,junit,Java,Junit,当我删除try/catch时,它可以工作,但无法测试阴性测试 public class TileCombinationSetsTest { @Test public void testTileCombinations() { new TileCombinationSets(); assertEquals(TileCombinationSets.tileCombinations(1).size(), 7);
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(intx)很难说。
如果可能,您可以发布该方法吗?在JUnit中,当测试方法抛出异常(或其他可抛出的异常)时,测试失败。JUnit的测试运行程序捕获异常并报告测试失败。另一方面,当测试方法在没有引发异常的情况下完成时,测试运行者认为测试成功。像
assertEquals
和fail
这样的语句会抛出一个错误
在您的测试中,失败(“预期异常”)
正在抛出错误。它会立即被捕获,因此测试方法testTileCombinations
不会引发异常。现在对于JUnit来说,该方法似乎已成功执行,因此它认为测试是成功的
如果您想测试TileCombinationSets.tileCombinations(4)
抛出异常,那么可以使用JUnit的
如果您想测试TileCombinationSets.tileCombinations(4)
不会引发异常,那么您只需执行它。(如果JUnit抛出异常,它将报告测试失败,否则将报告测试成功。)
通常情况下,您不应该捕获可丢弃的
,而应该捕获异常Throwable
还包括Error
的子类,这些子类是与Java运行时环境本身有关的关键错误(如OutOfMemoryError
),程序不应尝试从中恢复,因为它将程序置于未定义的状态
碰巧,示例中的fail()
方法抛出的AssertionError
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Throwable e) {}
还扩展了错误
因此,通过将代码更改为
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Exception e) {}
只要你的tileCombinations()
方法抛出的异常只扩展异常(他们应该这样做,因为自己扩展错误是不好的做法)。我不明白你的实际问题是什么。哪一部分给你带来了麻烦?你期望发生什么?实际发生了什么?不,上面的代码没有抛出任何异常,因此我希望调用失败,但它没有在上面的代码中,不应该到达失败的行…我要说的是是否到达失败行,测试总是成功的…我尝试做的测试是确保我使用无效参数测试的方法引发异常…它确实引发了异常…但是当它没有引发异常时…它仍然通过了测试,这不是我所期望的。如果TestTileCompositions引发了异常,它仍然被捕获,并且您有相同的问题:测试方法不会抛出异常,因此JUnit认为测试是成功的。我不知道为什么这么难。。。。。我希望在抛出异常时通过测试。。。。。如果没有出现异常,我希望测试失败。这并不困难。我延长了我的回答。
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Throwable e) {}
try {
TileCombinationSets.tileCombinations(4);
fail("Exceptions expected");
}
catch(Exception e) {}