为什么不管是否抛出异常,这个测试都会成功?

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 的测试运行程序捕获异常并将测试报告为失败。另一方面,当测试方法完成而没有抛出异常时,测试运行器认为测试成功。 assertEqualsfail 之类的语句抛出 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,而应捕捉 ExceptionThrowable 还包括 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 是不好的做法).