Expect an exception or one of its subclasses in Junit Test using @Test annotation
我有一个期望特定异常的测试,例如:
1 2 3 4 | @Test(expected=MyException.class) public void testMyMethod(){ myMethod(); } |
无论如何使用
我知道我可以自己编写测试检查逻辑而不使用
如果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
这已经由框架为您处理
我们举一个小例子(非常糟糕的代码):
import static org.junit.Assert。*;
1 2 3 4 5 6 7 8 9 10 11 | import org.junit.Test; public class TestExpect { @Test(expected=MyException.class) public void test() throws MyException { new Foo().foo(); } } |
有两个异常类MyException和MyExtendedException从前一个继承而且一个简单的Foo类如下:
1 2 3 4 5 6 | public class Foo { public void foo() throws MyException{ throw new MyExtendedException(); } } |
使用Eclipse运行器启动测试会打印一个绿色条,因为测试会引发一个Myexception实例(是POO中的关系)
如果您更喜欢阅读源代码,那么这是Junit源代码(ExpectException.java)的一个exxcerpt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @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()); } |
具有捕获异常的BDD样式解决方案
1 2 3 4 5 6 7 8 | @Test public void testMyMethod() { when(foo).myMethod(); then(caughtException()).isInstanceOf(MyException.class); } |
依赖
1 | com.googlecode.catch-exception:catch-exception:1.2.0 |