@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
,这样它就是一个未经检查的异常(即不受相同规则的约束)。
我正在使用 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
,这样它就是一个未经检查的异常(即不受相同规则的约束)。