Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不管是否引发异常,此测试都会成功?_Java_Junit - Fatal编程技术网

Java 为什么不管是否引发异常,此测试都会成功?

Java 为什么不管是否引发异常,此测试都会成功?,java,junit,Java,Junit,当我删除try/catch时,它可以工作,但无法测试阴性测试 public class TileCombinationSetsTest { @Test public void testTileCombinations() { new TileCombinationSets(); assertEquals(TileCombinationSets.tileCombinations(1).size(), 7);

当我删除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(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) {}