You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit中@Test注解expected参数不识别,如何测试自定义异常抛出?

问题与解决方案

问题说明

我要测试当传入number=0触发除以零场景时,getMultiplesOfGivenNumber方法是否抛出带自定义消息“Number cannot be zero”的ArithmeticException。用@Test(expected=java.lang.ArithmeticException.class)写测试用例时,IDE识别不了expected参数,之前写测试从没在@Test后加过参数,不确定是JUnit版本问题还是语法错误。

待测试方法:

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;
            }
        }
    }
    // 注意:原方法缺少return语句,需补充return multiples;才能编译通过
}

测试用例:

@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);
}

原因分析

@Test(expected=...)是JUnit 4的专属注解参数,如果你当前项目用的是JUnit 5(Jupiter),这个参数不存在,IDE自然无法识别。另外如果是JUnit 4环境,但误导入了JUnit 5的org.junit.jupiter.api.Test注解,也会出现该问题。

同时你的测试用例里,assertEquals(expected, result)这行代码永远不会执行——方法抛出异常后代码会直接终止,这行断言完全无效。

解决方案

情况1:使用JUnit 4

  1. 确保导入JUnit 4的Test注解:
    import org.junit.Test;
    
  2. 修正测试用例(移除无效断言):
    @Test(expected = ArithmeticException.class)
    public void testDivideByZero(){
        int number = 0;
        B3_E2.getMultiplesOfGivenNumber(number, intervalFromOneToTen());
    }
    
    若要验证自定义异常消息,需用JUnit 4的ExpectedException规则:
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.rules.ExpectedException;
    
    public class YourTestClass {
        @Rule
        public ExpectedException exceptionRule = ExpectedException.none();
    
        @Test
        public void testDivideByZeroWithCustomMessage(){
            int number = 0;
            exceptionRule.expect(ArithmeticException.class);
            exceptionRule.expectMessage("Number cannot be zero");
            B3_E2.getMultiplesOfGivenNumber(number, intervalFromOneToTen());
        }
    }
    

情况2:使用JUnit 5(推荐)

JUnit 5用assertThrows方法测试异常,同时可直接验证自定义消息,灵活性更强:

  1. 导入JUnit 5相关类:
    import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.assertThrows;
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
  2. 修正后的测试用例:
    @Test
    public void testDivideByZero(){
        int number = 0;
        // 捕获抛出的异常
        ArithmeticException exception = assertThrows(ArithmeticException.class, () -> {
            B3_E2.getMultiplesOfGivenNumber(number, intervalFromOneToTen());
        });
        // 验证自定义消息
        assertEquals("Number cannot be zero", exception.getMessage());
    }
    

内容的提问来源于stack exchange,提问作者umbruno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:01:10