在前面的文章中对于如何使用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
分享到:
相关推荐
junitrunner.zip,用于junitrunner实现的全功能spring插件,它允许不同的框架在同一个测试用例中协作
The package will take more output log than android.test.instrumationrunner.
junit-dataprovider.zip,一个类似于testng的junit a的dataprovider runner,类似于junit的dataprovider runner,具有许多附加功能
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....
单元测试—— Spring 环境下测试,所需要的jar包: spring-test-4.3.29.RELEASE.jar、junit-4.13.1.jar、hamcrest-core-1.3.jar。
自定义 JUnit-Test-Runner CEN 4072 - 软件测试项目
JUnit4 报错 no tests found with test runner 'JUnit4' 需要添加 hamcrest-core-2.2.jar 包重新启动
junit框架,基于源码分析runner实现原理
Junit4使用方法
入门产品特点在Junit 5平台上运行ScalaTest测试将ScalaTest完全集成到gradle中报告单个测试运行使用堆栈跟踪将错误报告给Junit 5 支持ScalaTest标签可选的在第一次测试失败后提前停止如何使用Gradle版本> = 4.5此库...
基本用法: $ junit2html JUNIT_XML_FILE [NEW_HTML_FILE]或者$ python -m junit2htmlreport JUNIT_XML_FILE [NEW_HTML_FILE]例如: $ junit2html pytest-results.xml testrun.html或者$ python -m junit2...
州长-junit-runner 概述 该项目旨在简化在 JUnit 测试中集成 。 这是使用此模块的 Governator Junit 测试的外观: @RunWith ( GovernatorJunit4Runner . class) @LifecycleInjectorParams ( modules = Sample...
JUnit套件并行运行器 这是一个带有POC的简单WIP项目,其思想是从不同的测试包中逐一并行运行jUnit Tests。 这个项目的想法是在并行模式执行的jUnit5功能的帮助下以并行模式运行套件。 每个套件将一个接一个地运行,...
unittest-xml-reporting, 基于 Ant/junit的测试 runner,类似于XML报告 unittest-xml-reportingunittest-xml-reporting是一个,测试 runner,可以以将测试结果保存到可以由生成系统。ide和 持续集成 服务器消耗的XM
固定的JUnit运行器 在构建服务器上没有更多的测试失败! 用法 @RunWith ( JUnitVWRunner . class) public class SampleUsage { @Test public void should_fail_only_in_friendly_environment () { assertTrue( 1 ...
根据别人的Junit做的一个工程,免费提供,可以运行。 参考:http://m.blog.csdn.net/blog/DLUTBruceZhang/8933645 运行时,1.选中AppsTester.java 2.鼠标右键 3. Debug as android Junit Test 4.Logcat就能看到测试...
Junit 5中文帮助指南,JUnit 5跟以前的JUnit版本不一样,它由几...此外,平台还提供了一个从命令行或者 Gradle 和 Maven 插件来启动的 控制台启动器 ,它就好比一个 基于JUnit 4的Runner 在平台上运行任何TestEngine。
junit-dataprovider:为JUnit提供一个类似于TestNG的dataprovider runner
Jasmine Junit Runner 这是什么? 像这样的东西: describe ( "pure awesomeness" , function ( ) { it ( "should be amazing!" , function ( ) { expect ( stuff ) . toEqual ( "amazing" ) ; } ) ; it ...
>jbehave-junit-runner</ artifactId > < version >2.3.0</ version > </ dependency > 请注意,JBehave 库设置为 POM 中provided的范围,因为任何使用此 Runner 的项目自然已经拥有自己的 JBehave 版本...