在Junit4中的调用JunitCore可以采用两种方式命令行调用和编程式实现.无论那种方式最终都要调用
public Result run(Computer computer, Class<?>[] classes) { return run(Request.classes(computer, classes)); } public Result run(Request request) { return run(request.getRunner()); } public Result run(Test test) { return run(new JUnit38ClassRunner(test)); }
在Junit4中Request.classes的方法具体执行什么呢?可以看出是执行器Runner对象.
那么Junit有几种执行的方式呢?
可以说是四种:
1.Junit3方式Runner
2.junit4方式Runner
3.注解方式Runner
4.Ignore方式Runner
下面我们来分析一下源代码:
public static Request classes(Computer computer, Class<?>[] classes) { try { AllDefaultPossibilitiesBuilder builder = new AllDefaultPossibilitiesBuilder( true); Runner suite = computer.getSuite(builder, classes); return runner(suite); } catch (InitializationError e) { throw new RuntimeException( "Bug in saff's brain: Suite constructor, called as above, should always complete"); } }
有上面代码可以看出AllDefaultPossibilitiesBuilder 可能使用创建者模式对象具体干嘛呢?
源代码如下:
public class AllDefaultPossibilitiesBuilder extends RunnerBuilder { private final boolean fCanUseSuiteMethod; public AllDefaultPossibilitiesBuilder(boolean canUseSuiteMethod) { this.fCanUseSuiteMethod = canUseSuiteMethod; } public Runner runnerForClass(Class<?> testClass) throws Throwable { List builders = Arrays.asList(new RunnerBuilder[] { ignoredBuilder(), annotatedBuilder(), suiteMethodBuilder(), junit3Builder(), junit4Builder() }); for (RunnerBuilder each : builders) { Runner runner = each.safeRunnerForClass(testClass); if (runner != null) { return runner; } } return null; } protected JUnit4Builder junit4Builder() { return new JUnit4Builder(); } protected JUnit3Builder junit3Builder() { return new JUnit3Builder(); } protected AnnotatedBuilder annotatedBuilder() { return new AnnotatedBuilder(this); } protected IgnoredBuilder ignoredBuilder() { return new IgnoredBuilder(); } protected RunnerBuilder suiteMethodBuilder() { if (this.fCanUseSuiteMethod) { return new SuiteMethodBuilder(); } return new NullBuilder(); } }
AllDefaultPossibilitiesBuilder 继承RunnerBuider,用于创建各种Runner的实现.
首先看看JUnit4Builder怎么实现:
public class JUnit4Builder extends RunnerBuilder { public Runner runnerForClass(Class<?> testClass) throws Throwable { return new BlockJUnit4ClassRunner(testClass); } }
JUnit4Builder 构建主要使用BlockJUnit4ClassRunner运行的测试用例.
Junit3Builder可以猜测为Junit3实现的单元测试使用
源代码:
public class JUnit3Builder extends RunnerBuilder { public Runner runnerForClass(Class<?> testClass) throws Throwable { if (isPre4Test(testClass)) { return new JUnit38ClassRunner(testClass); } return null; } boolean isPre4Test(Class<?> testClass) { return TestCase.class.isAssignableFrom(testClass); } }
可以看出junit3主要执行的Runner主要为JUnit38ClassRunner对象.
AnnotatedBuilder对象是干嘛用呢?主要是为注解实现的Runner运行器对象.
public Runner runnerForClass(Class<?> testClass) throws Exception { RunWith annotation = (RunWith) testClass.getAnnotation(RunWith.class); if (annotation != null) { return buildRunner(annotation.value(), testClass); } return null; } public Runner buildRunner(Class<? extends Runner> runnerClass, Class<?> testClass) throws Exception { try { return ((Runner) runnerClass.getConstructor( new Class[] { Class.class }).newInstance( new Object[] { testClass })); } catch (NoSuchMethodException e) { try { return ((Runner) runnerClass.getConstructor( new Class[] { Class.class, RunnerBuilder.class }) .newInstance( new Object[] { testClass, this.fSuiteBuilder })); } catch (NoSuchMethodException e2) { String simpleName = runnerClass.getSimpleName(); throw new InitializationError( String.format( "Custom runner class %s should have a public constructor with signature %s(Class testClass)", new Object[] { simpleName, simpleName })); } } }
可以看出AnnotatedBuilder主要是为使用RunWith且RunWith内的Class为Runner的对象实现执行的一种方式.还有一个就是IgnoredBuilder,这个是忽略执行的我们很少考虑这里就不再分析.
由此可见:
HttpJUnitRunner是Junit4的一种实现.在执行单元测试的时候采用的注解的方式执行.
相关推荐
junitrunner.zip,用于junitrunner实现的全功能spring插件,它允许不同的框架在同一个测试用例中协作
单元测试—— Spring 环境下测试,所需要的jar包: spring-test-4.3.29.RELEASE.jar、junit-4.13.1.jar、hamcrest-core-1.3.jar。
Junit设计模式分析 Junit设计模式分析 Junit设计模式分析 Junit设计模式分析
org.junit.runner.Runner.class org.junit.runner.manipulation.Filter.class org.junit.runner.manipulation.Filterable.class org.junit.runner.manipulation.NoTestsRemainException.class org.junit.runner....
JUnit设计模式分析 详细讲解JUnit源码中用到的设计模式
Junit设计模式分析,Junit设计模式分析.pdf,Junit设计模式分析.pdf,Junit设计模式分析.pdf
Junit框架是设计模式应用的经典案例,从中你可以更好的学习和掌握设计模式的使用!
重点讲到了junit里用到了那些设计模式.
一个参考Junit的设计模式ppt 一个参考Junit的设计模式ppt
junit框架,基于源码分析runner实现原理
Junit设计模式分析(带源码)
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage,包含依赖包:junit-jupiter-5.5.1.jar,junit-jupiter-engine-5.5.1.jar,junit-jupiter-params-5.5.1.jar,junit-platform-launcher-1.5.1.jar,junit-...
州长-junit-runner 概述 该项目旨在简化在 JUnit 测试中集成 。 这是使用此模块的 Governator Junit 测试的外观: @RunWith ( GovernatorJunit4Runner . class) @LifecycleInjectorParams ( modules = Sample...
Eclipse 插件允许使用上下文弹出菜单运行/调试 junit 测试方法。 启动方法由光标位置定义。 如果光标在方法之间,则启动整个 junit 类。 直到 v1.2.0:还允许使用 main() 方法运行/调试类。
junit3.8 和junit4 api
Junit 5中文帮助指南,JUnit 5跟以前的JUnit版本不一样,它由几...此外,平台还提供了一个从命令行或者 Gradle 和 Maven 插件来启动的 控制台启动器 ,它就好比一个 基于JUnit 4的Runner 在平台上运行任何TestEngine。
junit4.1junit4.1junit4.1junit4.1junit4.1
it IN Action ] 第一章 JUnit起步 JUnit jumpstart 本章内容 ■ 手工编写简单测试 ■ 安装JUnit以及运行测试 ...第二章 探索JUnit Exploring JUnit 本章内容 ■ 使用核心JUnit类 ■ 理解JUnit生命周期