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
- 确保导入JUnit 4的
Test注解:import org.junit.Test; - 修正测试用例(移除无效断言):
若要验证自定义异常消息,需用JUnit 4的@Test(expected = ArithmeticException.class) public void testDivideByZero(){ int number = 0; B3_E2.getMultiplesOfGivenNumber(number, intervalFromOneToTen()); }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方法测试异常,同时可直接验证自定义消息,灵活性更强:
- 导入JUnit 5相关类:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertEquals; - 修正后的测试用例:
@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
相关产品推荐
相关产品推荐

