`
longgangbai
  • 浏览: 7330214 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RestFuse的研究(二) Junit的Runner的分类和模式

阅读更多

      在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

    【junitrunner-spring-0.0.2.zip】是一个开源项目,主要目的是为了整合JUnit测试框架和Spring框架,提供一个全面的解决方案,使得开发者可以在同一个测试用例中灵活地利用两个框架的优点。这个压缩包包含的是名为...

    Junit设计模式分析

    2. 单例模式:JUnit的测试运行器(Runner)如`BlockJUnit4ClassRunner`就是一个单例,确保每个测试类只有一个实例,保证了测试的独立性和一致性。同时,JUnit允许自定义测试运行器,这为实现特定的测试逻辑提供了...

    junit源码解析之runner

    本篇文章将深入到JUnit的源码中,探讨Runner的实现原理,帮助开发者更好地理解和利用JUnit进行测试。 在JUnit中,Runner的主要职责是负责运行测试案例。默认的`BlockJUnit4ClassRunner`是JUnit4中的基础Runner,它...

    JUnit设计模式分析

    “代理模式”(Proxy Pattern)体现在JUnit的动态代理机制上,它允许JUnit在运行测试之前和之后插入额外的行为。例如,`MethodInvocationRule`可以通过Java的动态代理拦截并增强测试方法的调用。 此外,“观察者...

    SpringJUnit4ClassRunner 单元测试

    单元测试—— Spring 环境下测试,所需要的jar包: spring-test-4.3.29.RELEASE.jar、junit-4.13.1.jar、hamcrest-core-1.3.jar。

    junit源码以及牵涉到的设计模式

    #### 二、JUnit中的设计模式概述 ##### 1. Command 模式 在JUnit中,`TestCase`类扮演了命令角色,即一个具体的命令对象。这种模式允许程序员将“请求”封装成对象,从而使程序员可以用不同的请求对客户进行参数化...

    JUnit的框架设计及其使用的设计模式

    1. **工厂模式**:JUnit通过TestRunner类作为测试用例的工厂,根据测试类动态创建实例并执行测试。这种模式使得JUnit能够灵活地处理不同类型的测试类,无需预先知道具体的实现细节。 2. **装饰者模式**:JUnit允许...

    Junit设计模式分析(带源码)

    本资源"Junit设计模式分析(带源码)"旨在深入探讨JUnit在设计上的模式和最佳实践,通过源码分析帮助开发者更好地理解和应用这个工具。 1. 单元测试基础: 单元测试是对软件中的最小可测试单元进行检查,如函数、...

    junit的jar包

    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的测试运行器(Runner)中有所体现,如`BlockJUnit4ClassRunner`,它定义了执行测试的基本结构,而子类可以覆盖其中的方法来定制测试执行的细节。 最后,JUnit的可扩展性体现在其插件机制上,...

    一个参考Junit的设计模式ppt

    JUnit作为一个强大的单元测试框架,它的设计理念、核心特性和背后的优秀设计模式,对Java开发人员来说是不可或缺的工具。通过理解和熟练运用JUnit,开发者可以更有效地进行测试,提升代码质量,降低维护成本,从而...

    Junit4使用方法

    JUnit4 提供了多种测试运行器,例如JUnit4 PROVIDED runner、Eclipse JUnit runner 等。 Assert Assert 是 JUnit4 中的一个核心概念,用于定义测试条件。当条件成立时,assert 方法保持沉默;但条件不成立时则抛出...

    JUnit和设计模式.ppt

    JUnit的创建者是Erich Gamma和Kent Beck,Gamma是设计模式领域的著名作者,而Beck则是极限编程(XP)的发起人,他提倡用CRC卡片来辅助软件开发。 JUnit的主要目标是简化测试代码的编写,让程序员乐于编写测试,并...

    Junit设计模式应用

    《Junit设计模式应用》是基于作者业余时间的翻译成果,旨在通过设计模式的角度深入剖析JUnit的内在原理,以此促进读者对单元测试框架理解和运用能力的提升。设计模式是软件工程中的宝贵经验总结,它为解决常见问题...

    Junit设计模式分析.docx

    JUnit 的设计模式分析告诉我们,在软件开发过程中,使用设计模式可以提高代码的可读性、可维护性和可扩展性。JUnit 的成功也证明了设计模式的重要性,我们可以从中学习和借鉴,以提高自己的软件开发技能。 五、参考...

    Junit设计模式分析.pdf

    2. 单例模式:JUnit的TestRunner类通常作为一个单例存在,确保在一次测试运行中只有一个实例,保证了测试环境的一致性。 3. 观察者模式:JUnit支持监听器机制,允许开发者注册监听测试事件的类。例如,TestListener...

    junit实战第二版

    本段所提及的《JUnit实战第二版》是一本深入讲解JUnit框架的书籍,旨在帮助读者掌握JUnit的各种特性和最佳实践。书籍的结构分为多个章节,其中第一章节和第二章节分别介绍了JUnit的基本使用和深入探索。 在第一章...

Global site tag (gtag.js) - Google Analytics