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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:23:17