@Test(expected = Exception.class) 对我不起作用,我错过了什么?

@Test(expected = Exception.class) does not work for me, what am I missing?

我正在使用 sts,但也在命令行上使用 mvn clean install。我创建了这个简单的测试示例。

import org.junit.Test;

import junit.framework.TestCase;

public class QuickTest extends TestCase {

    @Test(expected = Exception.class)
    public void test() {
        throwsException();
    }

    private void throwsException() throws Exception {
        throw new Exception("Test");
    }
}

我的 STS (Eclipse) IDE 抱怨调用方法 testThrowsException() 的行;未处理的异常类型 Exception.

如果我尝试 运行 测试,我会得到同样的错误

java.lang.Error: Unresolved compilation problem: 
    Unhandled exception type Exception

我做错了什么?

您需要添加 throws 因为这是一个已检查的异常并且您希望该方法抛出它而不是处理它(用于测试目的)

@Test(expected = Exception.class)
    public void test() throws Exception{
        throwsException();
    }

问题是您在 注释 中按预期声明了 Exception。这是由 JUnit 确定的运行时行为。您的代码 仍然必须在编译时符合 所有 Java 的正常规则。在 Java 的正常规则下,当方法抛出检查异常时,您必须 1) 在方法签名中将其标记为抛出或 2) 捕获并处理它。您的代码两者都没有。对于您的测试,您想执行前者以使 JUnit 失败:

public class QuickTest extends TestCase
{
    @Test(expected = Exception.class)
    public void test() throws Exception {
        throwsException();
    }
}

或者您可以在这两种情况下将 Exception 更改为 RuntimeException,这样它就是一个未经检查的异常(即不受相同规则的约束)。