使用@Test注释在Junit Test中期望异常或其子类之一

chr*_*ney 8 java junit unit-testing junit4

我有一个期望特定异常的测试,例如:

@Test(expected=MyException.class)
public void testMyMethod(){
    myMethod();
}
Run Code Online (Sandbox Code Playgroud)

myMethod()方法实际上抛出了一个子类MyException,让我们调用它MySubclassException.

无论如何使用@Test注释定义我的测试来接受子类MyException以及类本身?

我知道我可以自己编写测试检查逻辑而不使用expected捕获异常和设置标志,但我想知道JUnit是否已经支持匹配异常子类.

rom*_*mje 3

框架已经为您处理了这个问题

让我们举一个小例子(非常糟糕的代码): import static org.junit.Assert.*;

import org.junit.Test;


public class TestExpect {

@Test(expected=MyException.class)
public void test() throws MyException {
    new Foo().foo();
}

}
Run Code Online (Sandbox Code Playgroud)

有 2 个异常类 MyException 和 MyExtendedException 继承自前一个异常类,还有一个简单的 Foo 类,如下所示:

public class Foo {

public void foo() throws MyException{
    throw new MyExtendedException();
}
}
Run Code Online (Sandbox Code Playgroud)

使用 Eclipse 运行程序启动测试会打印一个绿色条,因为测试引发了 MyException 的一个实例(是 POO 中的一种关系)

如果您喜欢阅读源代码,这是 Junit 源代码 (ExpectException.java) 的摘录:

   @Override
    public void evaluate() throws Exception {
        boolean complete = false;
        try {
            fNext.evaluate();
            complete = true;
        } catch (AssumptionViolatedException e) {
            throw e;
        } catch (Throwable e) {
            if (!fExpected.isAssignableFrom(e.getClass())) {
                String message= "Unexpected exception, expected<"
                            + fExpected.getName() + "> but was<"
                            + e.getClass().getName() + ">";
                throw new Exception(message, e);
            }
        }
        if (complete)
            throw new AssertionError("Expected exception: "
                    + fExpected.getName());
    }
Run Code Online (Sandbox Code Playgroud)

  • 我非常讨厌@Test(expected=)。主要原因是,它对于单行测试很有用,您知道异常将来自哪里,但一旦您有两行并且您想要断言第二行抛出异常,您就可以了。 (2认同)