博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JUnit4.12 源码分析之Statement
阅读量:5945 次
发布时间:2019-06-19

本文共 2853 字,大约阅读时间需要 9 分钟。

1. Statement

  • 抽象类Statement作为命令模式的Command,只有一个方法
  • 各种Runner作为命令模式中的Invoker,将发出各种Statement,来表示它们运行JUnit测试的整个过程;
  • org.junit.internal.runners.statement包中定义了Statement的子类(具体命令),来处理针对方法
    的标注,如@Test,@Before,@After,@BeforeClass,@AfterClass;
// org.junit.runners.model.Statementpublic abstract class Statement{    public abstract void evalute() throws Throwable;}// BlockJUnit4ClassRunner 中的符合命令,来处理 @Test, @Before, @After...// org.junit.runners.BlockJUnit4ClassRunnerpublic class BlockJUnit4ClassRunner extends ParentRunner
{ ...(略) protected Statement methodBlock(FrameworkMethod method){ Object test; try{ test = new ReflectiveCallable(){ @Override protected Object runReflectiveCall() throws Throwable{ return createTest(); } }.run(); }catch(Throwable e){ return new Fail(e); } // 各种Statement Statement statement = methodInvoker(method, test); statement = possiblyExpectingExceptions(method, test, statement); statement = withPotentialTimeout(method, test, statement); statement = withBefores(method, test, statement); statement = withAfters(method, test, statement); statement = withRules(method, test, statement); return statement; } // 根据反射,执行无参构造函数 protected Object createTest() throws Exception{ return getTestClass().getOnlyConstructor().newInstance(); } // Statement builders protected Statement methodInvoker(FrameworkMethod method, Object test){ return new InvokeMethod(method, test); }}

2.Statement 的实现类

  • org.junit.internal.runners.statements包下
    • ExpectException
    • Fail
    • FailOnTimeOut
    • InvokeMethod
    • RunAfters
    • RunBefores
// @Test(expected=IndexOutOfBoundsException.class)// 源码 org.junit.internal.runners.statements.ExpectExceptionpublic class ExpectException extends Statement{    private final Statement next;    private final Class
expected; public ExpectException(Statement next, Class
expected){ this.next = next; this.expected = expected; } @Override public void evalute() throws Exception{ boolean complete = false; try{ next.evalute(); complete = true; }catch(AssumptionViolatedException e){ throw e; }catch(Throwable e){ if(!expected.isAssignableFrom(e.getClass())){ String message = "Unexpected exception, expected<" + expected.getName() + "> but was<" + e.getClass().getName() + ">"; throw new Exception(messge, e); } } if(complete){ throw new AssertionError("Expected exception: " + expected.getName()); } }}

参考资料:

转载于:https://www.cnblogs.com/linkworld/p/9061967.html

你可能感兴趣的文章
利用jenkins+saltstack+sh部署项目到多台服务器
查看>>
Android项目实战(十二):解决OOM的一种偷懒又有效的办法
查看>>
五大理由分析Springboot 2.0为什么选择HikariCP
查看>>
最佳实战Docker持续集成图文详解
查看>>
Linux下批量ping某个网段ip的脚本
查看>>
Grid++Report报表工具C/S实战篇(五)
查看>>
js scrollIntoViewIfNeeded
查看>>
提高MSSQL数据库性能(1)对比count(*) 和 替代count(*)
查看>>
jenkins插件安装失败更改插件源
查看>>
手把手教你搭建一个基于Java的分布式爬虫系统
查看>>
基于SpringMVC+Spring+MyBatis实现秒杀系统【概况】
查看>>
BZOJ1432: [ZJOI2009]Function(找规律)
查看>>
C++源码里没有./configure文件的问题
查看>>
[E2E] Visual Differing Tests with Puppeteer and PixelMatch
查看>>
springboot中@EnableAsync与@Async注解使用
查看>>
Nginx配置ssl证书
查看>>
为什么你SQL Server的数据库文件的Date modified没有变化呢?
查看>>
spring 源码
查看>>
Vue .Net 前后端分离框架搭建
查看>>
清理sql2012数据库日志
查看>>