在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-spring-0.0.2.zip】是一个开源项目,主要目的是为了整合JUnit测试框架和Spring框架,提供一个全面的解决方案,使得开发者可以在同一个测试用例中灵活地利用两个框架的优点。这个压缩包包含的是名为...
2. 单例模式:JUnit的测试运行器(Runner)如`BlockJUnit4ClassRunner`就是一个单例,确保每个测试类只有一个实例,保证了测试的独立性和一致性。同时,JUnit允许自定义测试运行器,这为实现特定的测试逻辑提供了...
本篇文章将深入到JUnit的源码中,探讨Runner的实现原理,帮助开发者更好地理解和利用JUnit进行测试。 在JUnit中,Runner的主要职责是负责运行测试案例。默认的`BlockJUnit4ClassRunner`是JUnit4中的基础Runner,它...
“代理模式”(Proxy Pattern)体现在JUnit的动态代理机制上,它允许JUnit在运行测试之前和之后插入额外的行为。例如,`MethodInvocationRule`可以通过Java的动态代理拦截并增强测试方法的调用。 此外,“观察者...
单元测试—— Spring 环境下测试,所需要的jar包: spring-test-4.3.29.RELEASE.jar、junit-4.13.1.jar、hamcrest-core-1.3.jar。
#### 二、JUnit中的设计模式概述 ##### 1. Command 模式 在JUnit中,`TestCase`类扮演了命令角色,即一个具体的命令对象。这种模式允许程序员将“请求”封装成对象,从而使程序员可以用不同的请求对客户进行参数化...
1. **工厂模式**:JUnit通过TestRunner类作为测试用例的工厂,根据测试类动态创建实例并执行测试。这种模式使得JUnit能够灵活地处理不同类型的测试类,无需预先知道具体的实现细节。 2. **装饰者模式**:JUnit允许...
本资源"Junit设计模式分析(带源码)"旨在深入探讨JUnit在设计上的模式和最佳实践,通过源码分析帮助开发者更好地理解和应用这个工具。 1. 单元测试基础: 单元测试是对软件中的最小可测试单元进行检查,如函数、...
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的测试运行器(Runner)中有所体现,如`BlockJUnit4ClassRunner`,它定义了执行测试的基本结构,而子类可以覆盖其中的方法来定制测试执行的细节。 最后,JUnit的可扩展性体现在其插件机制上,...
JUnit作为一个强大的单元测试框架,它的设计理念、核心特性和背后的优秀设计模式,对Java开发人员来说是不可或缺的工具。通过理解和熟练运用JUnit,开发者可以更有效地进行测试,提升代码质量,降低维护成本,从而...
JUnit4 提供了多种测试运行器,例如JUnit4 PROVIDED runner、Eclipse JUnit runner 等。 Assert Assert 是 JUnit4 中的一个核心概念,用于定义测试条件。当条件成立时,assert 方法保持沉默;但条件不成立时则抛出...
JUnit的创建者是Erich Gamma和Kent Beck,Gamma是设计模式领域的著名作者,而Beck则是极限编程(XP)的发起人,他提倡用CRC卡片来辅助软件开发。 JUnit的主要目标是简化测试代码的编写,让程序员乐于编写测试,并...
《Junit设计模式应用》是基于作者业余时间的翻译成果,旨在通过设计模式的角度深入剖析JUnit的内在原理,以此促进读者对单元测试框架理解和运用能力的提升。设计模式是软件工程中的宝贵经验总结,它为解决常见问题...
JUnit 的设计模式分析告诉我们,在软件开发过程中,使用设计模式可以提高代码的可读性、可维护性和可扩展性。JUnit 的成功也证明了设计模式的重要性,我们可以从中学习和借鉴,以提高自己的软件开发技能。 五、参考...
2. 单例模式:JUnit的TestRunner类通常作为一个单例存在,确保在一次测试运行中只有一个实例,保证了测试环境的一致性。 3. 观察者模式:JUnit支持监听器机制,允许开发者注册监听测试事件的类。例如,TestListener...
本段所提及的《JUnit实战第二版》是一本深入讲解JUnit框架的书籍,旨在帮助读者掌握JUnit的各种特性和最佳实践。书籍的结构分为多个章节,其中第一章节和第二章节分别介绍了JUnit的基本使用和深入探索。 在第一章...