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

RestFuse的研究(三) Junit的Rule的使用和分析

阅读更多

          在junit中定义一些可以公用的规则(Rule),类似拦截器和拦截器链的概念.在Junit4版本中针对不同的版本Rule的接口不一样,在Junit4.11和Junit4.10 采用实现TestRule接口.在Junit4.8采用的MethodRule接口.

备注:

         RestFuse使用1.2.0,

          Junit采用4.10版本.

如在RestFuse中定义Destination实现TestRule接口.实现apply方法:

public Statement apply(Statement base, Description description);

 

使用如下:

package com.easyway.restfuse;

import org.junit.Rule;
import org.junit.runner.RunWith;

import com.eclipsesource.restfuse.Destination;
import com.eclipsesource.restfuse.HttpJUnitRunner;
import com.eclipsesource.restfuse.Method;
import com.eclipsesource.restfuse.Response;
import com.eclipsesource.restfuse.annotation.Context;
import com.eclipsesource.restfuse.annotation.HttpTest;
/**
 * 
 * @author longgangbai
 *
 */
@RunWith( HttpJUnitRunner.class )
public class RestfuseTest {
 
  @Rule
  public Destination destination = new Destination("", "http://restfuse.com" ); 
 
  @Context
  private Response response; // will be injected after every request
 
  @HttpTest( method = Method.GET, path = "/" )
  public void checkRestfuseOnlineStatus() {
	  System.out.println( response);
  }  
}

 

在junit4中Rule怎么调用的呢?

     在BlockJUnit4ClassRunner中的methodBlock中进行测试方法的各种操作.如BeforeMethod,AfterMethod等的组装为Statement .

	protected Statement methodBlock(FrameworkMethod method) {
		Object test;
		try {
			test = new ReflectiveCallable() {
				protected Object runReflectiveCall() throws Throwable {
					return BlockJUnit4ClassRunner.this.createTest();
				}
			}.run();
		} catch (Throwable e) {
			return new Fail(e);
		}

		Statement statement = methodInvoker(method, test);
		statement = possiblyExpectingExceptions(method, test, statement);
		statement = withPotentialTimeout(method, test, statement);
		statement = withBefores(method, test, statement);
		statement = withAfters(method, test, statement);
		statement = withRules(method, test, statement);
		return statement;
	}

 其中最后一个withRules,同时可以看出possiblyExpectingExceptions,withPotentialTimeout,withBefores,withAfters被不推荐使用.其实他们几个都可以采用Rule的方式现实,这也是不推荐使用的主要原因.

 

具体的Rule相关的源代码:

	private Statement withRules(FrameworkMethod method, Object target,
			Statement statement) {
		List testRules = getTestRules(target);
		Statement result = statement;
		result = withMethodRules(method, testRules, target, result);
		result = withTestRules(method, testRules, result);

		return result;
	}

	private Statement withMethodRules(FrameworkMethod method,
			List<TestRule> testRules, Object target, Statement result) {
		for (MethodRule each : getMethodRules(target)) {
			if (!(testRules.contains(each))) {
				result = each.apply(result, method, target);
			}
		}
		return result;
	}

	private List<MethodRule> getMethodRules(Object target) {
		return rules(target);
	}

	protected List<MethodRule> rules(Object target) {
		return getTestClass().getAnnotatedFieldValues(target, Rule.class,
				MethodRule.class);
	}

	private Statement withTestRules(FrameworkMethod method,
			List<TestRule> testRules, Statement statement) {
		return new RunRules(statement, testRules, describeChild(method));
	}

	protected List<TestRule> getTestRules(Object target) {
		List result = getTestClass().getAnnotatedMethodValues(target,
				Rule.class, TestRule.class);

		result.addAll(getTestClass().getAnnotatedFieldValues(target,
				Rule.class, TestRule.class));

		return result;
	}

 

可以看出Rule不仅有类级别的还有方法的级别的.

 

 

分享到:
评论

相关推荐

    探索JUnit4扩展:深入Rule

    例如,JUnit自带的`ExpectedException` Rule可以帮助我们捕获和验证预期的异常: ```java import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class MyTest { @...

    在JUnit中使用@Rule测试文件和目录Java开发Ja

    在实际开发中,`@Rule`还可以与其他JUnit注解一起使用,如`@BeforeClass`和`@AfterClass`,以确保测试类级别的资源管理。例如,可以创建一个`ClassRule`来初始化一次性的测试环境,如数据库连接池。 总的来说,通过...

    Junit设计模式分析

    在Junit中,设计模式的应用极大地增强了其灵活性和可扩展性。下面我们将深入探讨Junit中涉及到的设计模式及其作用。 1. 工厂模式:JUnit中的`TestSuite`类就是一个典型的工厂模式应用,它根据传入的类或测试方法...

    JUnit设计模式分析

    JUnit 是一个广泛使用的Java单元测试框架,由著名软件开发者Erich Gamma和Kent Beck共同创建。设计模式在JUnit的实现中扮演了重要角色,使得测试代码易于编写、持久且可扩展。JUnit的目标是简化测试编写,确保测试的...

    JUnit3.8.1 以及使用JUnit测试的代码demo

    JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。JUnit3.8.1是该框架的一个较早版本,尽管现在已经有更新的版本(如JUnit5),但了解其基本...

    探索JUnit4扩展:使用Rule

    标题“探索JUnit4扩展:使用Rule”涉及到的是Java单元测试框架JUnit的一个高级特性,即`@...通过研究这些内容,开发者可以更直观地学习如何定义和使用`@Rule`,以及如何将其应用于实际项目中,提升测试的质量和效率。

    JUnit的使用.doc

    JUnit的使用.doc JUnit的使用.doc

    Junit4使用方法

    JUnit4 使用方法 JUnit4 是一个流行的 Java 单元测试框架,提供了许多功能强大且灵活的测试工具。...通过学习 JUnit4 的使用方法和核心概念,可以提高测试效率和测试质量,确保软件的可靠性和稳定性。

    junit总结使用例子

    JUnit的最新版本是JUnit 5,它分为JUnit Platform、JUnit Jupiter和JUnit Vintage三个模块,提供了更强大的测试能力和更好的兼容性。 ### 安装与引入 在Maven项目中,添加以下依赖到pom.xml文件中,即可引入JUnit 5...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    JUnit如何使用介绍

    (在此文档中我使用JUnit的版本为JUnit4.3.1)先检查一下你的Eclipse环境是否已经有编写JUnit测试类的环境了,如果有了就可以直接使用了,如果没有安装,请参考以下操作,如:在Eclipse要安装那些插件和写JUnit测试...

    junit的使用

    7. **查看测试结果**:测试执行完毕后,会生成详细的测试报告,包括成功、失败、错误等信息,帮助我们分析和调试代码。 在"JunitTest"这个压缩包中,可能包含了演示如何在Android环境中使用Junit进行单元测试的相关...

    Junit使用说明 详细

    《Junit使用详解》 Junit,作为Java编程语言中最为...配合PPT讲解和文档`Junit使用入门.doc`,相信能让你对Junit有更深入的理解。 请参考提供的`junit.jar`文件,将其导入到你的项目中,开始你的Junit测试之旅吧!

    Android代码-A JUnit rule to easily override Dagger 2 objects

    A JUnit rule to easily override Dagger 2 objects More info about testing using Dagger 2 and Mockito are available in this Medium post. Overriding an object managed by Dagger 2 is not easy, you ...

    JUnit设计模式分析及简化的JUnit代码

    通过理解和应用这些设计模式,我们可以更有效地使用JUnit,提高测试的质量和效率。同时,这些模式也是软件工程中通用的最佳实践,能够帮助我们编写出更加灵活、可维护的代码。因此,深入研究JUnit的设计模式对于提升...

    JUnit in Action 3nd Edition

    JUnit的架构主要由三个部分组成:Test Runner、Test Case和Assertion。Test Runner是JUnit的执行引擎,负责执行测试用例。Test Case是测试用例的集合,每个测试用例都包含多个测试方法。Assertion是JUnit中的断言...

Global site tag (gtag.js) - Google Analytics