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

JUnit扩展方式(二)-使用Runner对JUnit进行扩展(基础)

阅读更多
在前面的文章中对于如何使用Rule对JUnit进行扩展进行了说明,在Rule之前对于JUnit的扩展使用的方式是通过创建一个继承自BlockJUnit4ClassRunner类的新的Runner类,然后在测试用例中通过@RunWith指定使用新的Runner来运行测试类实现的;
具体步骤如下:
1)创建一个新的Runner类,该类继承自BlockJUnit4ClassRunner;
2)在测试类中通过@RunWith指定使用新的Runner替代默认的Runner;
注:文中描述的只是一个Demo,操作的逻辑判断直接写在Runner中,实际过程中需要将Runner和操作逻辑解耦,实现一个松耦合的Runner;
代码如下:
创建继承自BlockJUnit4ClassRunner的新Runner:
package extension.runner;

import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;

import extension.rule.AfterMethod;
import extension.rule.BeforeMethod;

@SuppressWarnings("deprecation")
public class ExtensionRunner extends BlockJUnit4ClassRunner {

	private Class<?> clazz;

	public ExtensionRunner(Class<?> klass) throws InitializationError {
		super(klass);
		this.clazz = klass;
	}

	// Extend @BeforeClass, add additional operations to @BeforeClass
	protected Statement withBeforeClasses(final Statement statement) {
		final Statement junitStatement = super.withBeforeClasses(statement);
		return new Statement() {
			@Override
			public void evaluate() throws Throwable {
				System.out.println("Before Class: " + clazz.getName());
				junitStatement.evaluate();
			}

		};
	}

	protected Statement withBefores(final FrameworkMethod method,
			Object target, final Statement statement) {
		final Statement junitStatement = super.withBefores(method, target,
				statement);
		return new Statement() {
			@Override
			public void evaluate() throws Throwable {
				if (method.getAnnotation(BeforeMethod.class) != null) {
					System.out.println(((BeforeMethod) method
							.getAnnotation(BeforeMethod.class)).message());
				}
				junitStatement.evaluate();
			}

		};
	}

	protected Statement withAfters(final FrameworkMethod method, Object target,
			final Statement statement) {
		final Statement junitStatement = super.withAfters(method, target,
				statement);
		return new Statement() {
			@Override
			public void evaluate() throws Throwable {
				junitStatement.evaluate();
				if (method.getAnnotation(AfterMethod.class) != null) {
					System.out.println(((AfterMethod) method
							.getAnnotation(AfterMethod.class)).message());
				}
			}

		};
	}

	protected Statement withAfterClasses(final Statement statement) {
		final Statement junitStatement = super.withAfterClasses(statement);
		return new Statement() {
			@Override
			public void evaluate() throws Throwable {
				junitStatement.evaluate();
				System.out.println("After Class: " + clazz.getName());
			}

		};
	}
}

在测试类中指定新的Runner代替默认Runner:
package test;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;

import extension.rule.AfterMethod;
import extension.rule.BeforeMethod;
import extension.runner.ExtensionRunner;

@RunWith(ExtensionRunner.class)
public class RunnerTestCase {

	@BeforeClass
	public static void beforeClass() {
		System.out.println("beforeClass");
	}

	@Before
	public void before() {
		System.out.println("before");
	}
	
	@Test
	@BeforeMethod(message="test_1 before method")
	public void test_1() {
		System.out.println("test_1");
	}
	
	@Test
	@AfterMethod(message="test_2 after method")
	public void test_2() {
		System.out.println("test_2");
	}
	
	@Test
	@BeforeMethod(message="test_3 before method")
	@AfterMethod(message="test_3 after method")
	public void test_3() {
		System.out.println("test_3");
	}
	
	@After
	public void after() {
		System.out.println("after");
	}

	@AfterClass
	public static void afterClass() {
		System.out.println("afterClass");
	}
}

运行结果如下:
  • 大小: 32.8 KB
分享到:
评论

相关推荐

    JUnit5用户手册-中文

    - `junit-platform-runner`:JUnit4 环境下的 Runner 支持。 - `junit-platform-surefire-provider`:Maven Surefire 插件支持。 - **JUnit Jupiter**: - `junit-jupiter-api`:用于编写测试用例和扩展的 API。...

    surefire-junit4-2.7.2-javadoc.jar

    通过阅读这些文档,我们可以了解如何配置Surefire以支持JUnit4的测试,以及如何利用JUnit4提供的各种断言和注解进行单元测试。 在Surefire中,核心概念是"Maven测试生命周期"。在Maven的构建过程中,测试阶段分为...

    junitrunner-spring-0.0.2.zip

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

    junit-4.12.jar hamcrest-library-1.3.rc2.jar hamcrest-core-1.3.rc2.jar

    在使用这些库进行单元测试时,我们通常会创建一个继承自`org.junit.runner.RunWith`的测试类,并在其中定义具体的测试方法。然后,我们可以利用JUnit提供的注解来控制测试的执行流程,如`@Ignore`可以忽略某个测试,...

    SSM中进行单元测试Junit4+spring-test所需jar包

    要使用Junit4,首先需要在项目中引入junit-4.x.x.jar包。 spring-test是Spring框架的一部分,专门用于测试Spring应用程序。它提供了与Spring容器集成的测试工具,如`@ContextConfiguration`用于加载配置,`@...

    junit-4.5-SNAPSHOT-20070720-

    总的来说,"junit-4.5-SNAPSHOT-20070720-"是JUnit发展历程中的一个重要里程碑,它通过注解和数据驱动测试等创新特性,极大地推动了Java测试实践的发展,为后续版本的持续优化奠定了坚实的基础。对于任何致力于提高...

    android-ui-test-runner-master.rar

    1. **Test Runner**:`android-ui-test-runner`中的Test Runner是自定义的JUnit测试运行器,它扩展了`android.support.test.runner.AndroidJUnitRunner`,添加了额外的功能,如测试报告生成、测试覆盖率统计等。...

    junit jar包及依赖jar

    - `junit-platform-engine.jar`和`junit-platform-launcher.jar`:这些是JUnit 5引入的平台引擎和启动器,它们支持新的测试架构,允许JUnit与其他测试引擎协同工作。 在使用JUnit时,通常会将这些依赖的jar包添加到...

    the-missing-android-xml-junit-test-runner-release

    The package will take more output log than android.test.instrumationrunner.

    JUnit三分钟教程 ---- 快速起步

    在本文中,我们将快速浏览一个简单的JUnit入门教程,帮助你理解如何使用JUnit进行基本的测试。 首先,我们需要创建一个待测试的类。在本例中,我们有一个名为`Calculator`的类,它有一个`add`方法用于计算两个数字...

    junit4.9.zip

    这个压缩包“junit4.9.zip”包含了该版本的两个关键组成部分,即junit-dep-4.9.jar和junit-4.9-src.jar,它们为理解和使用JUnit 4.9提供了必要的资源。 1. **junit-dep-4.9.jar**:这是JUnit的核心库文件,包含了...

    junit-4.12.jar+hamcrest-core-1.3.jar

    总的来说,`junit-4.12.jar` 和 `hamcrest-core-1.3.jar` 是Java单元测试不可或缺的工具。它们一起提供了强大的测试能力,帮助开发者编写出清晰、可读且易于维护的测试代码,确保软件的质量和稳定性。在实际开发中,...

    scalatest-junit-runner:Scalatest的JUnit 5运行器

    入门产品特点在Junit 5平台上运行ScalaTest测试将ScalaTest完全集成到gradle中报告单个测试运行使用堆栈跟踪将错误报告给Junit 5 支持ScalaTest标签可选的在第一次测试失败后提前停止如何使用Gradle版本&gt; = 4.5此库...

    JUnit 4测试驱动开发----junit技术讲解

    在开始使用JUnit 4进行测试之前,了解一些预备知识是必要的。例如,Java 5引入的可变长参数(Variable-Length Arguments)允许函数接收不定数量的参数,这对于构建灵活的测试方法非常有用。Assert类提供了多种断言...

    android-junit5,使用junit 5进行android测试。.zip

    总的来说,“android-junit5”插件为Android开发者提供了一种简单、高效的方式来集成和使用JUnit5进行测试。通过它的帮助,我们可以编写出更加清晰、可读性强的测试代码,提升测试的质量和速度,从而更好地保证我们...

    junit与selenium集成使用手册

    ### JUnit与Selenium集成使用手册 #### 一、引言 随着软件开发技术的不断发展,自动化测试成为了提高软件质量的重要手段之一。JUnit 和 Selenium 是两款广泛使用的自动化测试工具,JUnit 主要用于 Java 应用程序的...

    junit源码解析之runner

    默认的`BlockJUnit4ClassRunner`是JUnit4中的基础Runner,它按照一定的顺序执行注解了@Test的方法。Runner的实现基于Java反射机制,可以动态地发现和执行测试方法。 首先,Runner的启动通常是由`@RunWith`注解触发...

    junit-3.8.1.jar资源

    在使用`junit-3.8.1.jar`时,开发者需要将其添加到项目的类路径中,然后就可以开始编写和运行测试了。同时,配合IDE(如Eclipse、IntelliJ IDEA)的JUnit插件,可以方便地管理和执行测试,查看测试结果和调试问题。

    moco-runner-0.10.2-standalone.jar

    Mock测试是一种在软件开发中广泛使用的测试技术,它允许开发者在真实环境难以模拟或实际依赖不可用时,创建虚拟的对象来代替真实的组件进行测试。"moco-runner-0.10.2-standalone.jar" 文件是Mockito框架的一个版本...

    Junit基础培训

    - **示例代码**:一个简单的测试示例展示了如何使用Junit进行测试。 - **测试对象**:一个名为`sex`的类,包含一个根据输入返回性别的方法`getsex`。 - **测试类**:名为`test`的测试类,其中包含两个测试用例`Man...

Global site tag (gtag.js) - Google Analytics