Intellij Idea 测试程式码是否掷回特定例外状况[duplicate]

7kjnsjlb  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(160)

此问题在此处已有答案

How do you assert that a certain exception is thrown in JUnit tests?(34个答案)
JUnit 5: How to assert an exception is thrown?(11个答案)
4天前关闭。
我尝试测试在尝试除以零时是否会引发带有自定义消息的异常。
方法如下:

public static int getMultiplesOfGivenNumber(int number, int[] array){

    int multiples = 0;

    if (number == 0) {
        throw new ArithmeticException("Number cannot be zero");
    }else{
        for (int i = 0; i < array.length; i++) {
            if (array[i] % number == 0) {
                multiples += 1;
            }
        }
    }

在搜索了一些解决方案后,我发现这是一种方法,但我的IDE无法识别“预期”...

@Test(expected=java.lang.ArithmeticException.class)
public void testDivideByZero(){
    //arrange
    int number = 0;
    //act
    int result = B3_E2.getMultiplesOfGivenNumber(number, intervalFromOneToTen());
    //assert
    assertEquals(expected, result);

}

我只是不知道为什么我的IDE不能识别“expected”。不知道这是否与Junit版本有关,或者是否与我使用的语法有关。
到目前为止,在我使用的其他测试中,我从来没有在@Test后面放任何东西。我只是在另一个类似问题的线程中找到了这个解决方案。

vql8enpb

vql8enpb1#

@Test注解的expected参数只存在于JUnit 4之后。您必须使用较早版本的JUnit。
话虽如此,您不必使用此注解,因此不必仅为了此特性而升级到JUnit 4。
您可以自己使用try...catch,并Assert抛出了异常,还Assert自定义消息是它应该是的。

@Test
public void testDivideByZero()
{
    try
    {
        B3_E2.getMultiplesOfGivenNumber( 0, intervalFromOneToTen() );
        assertTrue( false ); //expected exception was not thrown
    }
    catch( ArithmeticException e )
    {
        assertEquals( e.getMessage(), "Number cannot be zero" );
    }
}

这样做的好处是你可以得到异常对象,这样你就可以检查它的内容,并确保它是按预期初始化的。在ArithmeticException的情况下,除了消息之外没有什么要检查的,但在其他情况下,可能有很多要检查的。

相关问题