JUnit测试预期异常未捕获问题排查:测试用例执行失败求助
问题分析与解决
从你的测试运行栈信息里能看到关键线索:org.junit.internal.runners.JUnit38ClassRunner.run,这说明你的测试类是继承了junit.framework.TestCase(JUnit 3的测试类基类),JUnit会用JUnit 3的兼容运行器来执行测试——但JUnit 3根本不支持JUnit 4的@Test(expected)注解和@Rule注解!所以你写的这些预期异常配置完全没生效,抛出的UnsupportedOperationException被JUnit 3当成测试失败处理,导致进程退出码为-1。
另外你的第一种写法还有额外问题:你同时混用了@Test(expected = UnsupportedOperationException.class)和ExpectedException规则,而且规则里指定的是InvalidBarcodeException,和实际抛出的异常类型不匹配——就算是在JUnit 4环境下,这种写法也会失败。
解决方案
方案1:切换到JUnit 4测试结构(推荐)
把测试类改成普通类,不要继承TestCase,让JUnit用默认的JUnit 4运行器执行,这样注解就能正常工作了:
写法一:使用ExpectedException规则(修正异常类型)
import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.util.Locale; public class MoneyTest { // 不要继承TestCase @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testNotAddingDifferentCurrency(){ // 预期的异常要和实际抛出的一致 thrown.expect(UnsupportedOperationException.class); Money money1 = new Money("4.43", Locale.GERMANY); Money money2 = new Money("1.436", Locale.US); money1.add(money2); } }
写法二:使用@Test(expected)注解
import org.junit.Test; import java.util.Locale; public class MoneyTest { @Test(expected = UnsupportedOperationException.class) public void testNotAddingDifferentCurrency(){ Money money1 = new Money("4.43", Locale.GERMANY); Money money2 = new Money("1.436", Locale.US); money1.add(money2); } }
方案2:如果必须保留JUnit 3结构
手动在测试方法里捕获异常并验证:
import junit.framework.TestCase; import java.util.Locale; public class MoneyTest extends TestCase { public void testNotAddingDifferentCurrency(){ try { Money money1 = new Money("4.43", Locale.GERMANY); Money money2 = new Money("1.436", Locale.US); money1.add(money2); // 如果没抛出异常,手动标记测试失败 fail("Expected UnsupportedOperationException was not thrown"); } catch (UnsupportedOperationException e) { // 捕获到预期异常,测试通过 } } }
内容的提问来源于stack exchange,提问作者Paweł Bocian
相关产品推荐
相关产品推荐

