Junit的RunWith的流程图解

以@RunWith(Theories.class)为例,如下图:

主要是RunnerBuilder的逻辑,AllDefaultPossibilitiesBuilder的runnerForClass会自动加载5个Builder, 然后一次遍历这5个builder,执行safeRunnerForClass方法生成runner,如果有一个builder返回的runner不为空,那么直接将这个runner返回,不再遍历其他builder,后面走的就是JunitCore的run(Runner runner)方法,具体参考https://blog.csdn.net/newbaby2012/article/details/118461573

这里runner的加载,其实是通过RunnerBuilder的子类(比如AnnotatedBuilder)调用runnerForClass:

@Override
    public Runner runnerForClass(Class<?> testClass) throws Exception {
        for (Class<?> currentTestClass = testClass; currentTestClass != null;
             currentTestClass = getEnclosingClassForNonStaticMemberClass(currentTestClass)) {
            RunWith annotation = currentTestClass.getAnnotation(RunWith.class);
            if (annotation != null) {
                return buildRunner(annotation.value(), testClass);
            }
        }

        return null;
    }

然后builderRunner里面通过getConstruct以及newInstance来加载并返回runner的,本文就是Theories: 

 public Runner buildRunner(Class<? extends Runner> runnerClass,
            Class<?> testClass) throws Exception {
        try {
            return runnerClass.getConstructor(Class.class).newInstance(testClass);
        } catch (NoSuchMethodException e) {
            try {
                return runnerClass.getConstructor(Class.class,
                        RunnerBuilder.class).newInstance(testClass, suiteBuilder);
            } catch (NoSuchMethodException e2) {
                String simpleName = runnerClass.getSimpleName();
                throw new InitializationError(String.format(
                        CONSTRUCTOR_ERROR_FORMAT, simpleName, simpleName));
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值