在RestFuse提供了多种单元测试的方式,这里只是关注常用的三种方式.
其中1.常见的请求一次
2.请求一次并回调.
3.多个请求.
在junit4中Statement可以用来执行调用.可以采用类似执行链的封装使用.在RestFuse中封装的Statement有多个,如BasicStatement:执行的普通请求相应.
HttpTestStatement:处理请求的回调和多个调用.
在Destination中Statement被调用:
源代码如下:
public Statement apply(Statement base, Description description) { Statement result; Statement result; if (hasAnnotation(description)) { this.requestStatement = new HttpTestStatement(base, description, this.testObject, this.baseUrl, this.proxyHost, this.proxyPort, this.context); result = this.requestStatement; } else { result = base; } return result; }
HttpTestStatement实现Statement主要代码封装如下:
public class HttpTestStatement extends Statement { static final String HTTP_PROXY_HOST = "http.proxyHost"; static final String HTTP_PROXY_PORT = "http.proxyPort"; private final Statement base; private final Description description; private final Object target; private final String baseUrl; private final String proxyHost; private final int proxyPort; private final RequestContext context; public HttpTestStatement(Statement base, Description description, Object target, String baseUrl, String proxyHost, int proxyPort, RequestContext context) { this.base = base; this.description = description; this.target = target; this.baseUrl = baseUrl; this.proxyHost = proxyHost; this.proxyPort = proxyPort; this.context = context; } public void evaluate() throws Throwable { setProxyProperties(); try { doEvaluate(); } finally { unsetProxyProperties(); } } private void setProxyProperties() { if (this.proxyHost != null) { System.setProperty("http.proxyHost", this.proxyHost); System.setProperty("http.proxyPort", String.valueOf(this.proxyPort)); } } private void doEvaluate() throws Throwable { Statement delegate = new BasicStatement(this.base, this); if (needsCallback()) delegate = new CallbackStatement(this.base, this, this.description, this.target); else if (needsPoll()) { delegate = new PollStatement(this.base, this, this.description, this.target); } delegate.evaluate(); } private void unsetProxyProperties() { Properties properties = System.getProperties(); properties.remove("http.proxyHost"); properties.remove("http.proxyPort"); } private boolean needsCallback() { Callback callbackAnnotation = (Callback) this.description .getAnnotation(Callback.class); return (callbackAnnotation != null); } private boolean needsPoll() { Poll pollAnnotation = (Poll) this.description.getAnnotation(Poll.class); return (pollAnnotation != null); } public Response sendRequest() { InternalRequest request = buildRequest(); return callService(request); } private InternalRequest buildRequest() { RequestConfiguration requestConfiguration = new RequestConfiguration( this.baseUrl, this.description, this.target); return requestConfiguration.createRequest(this.context); } private Response callService(InternalRequest request) { Method requestMethod = ((HttpTest) this.description .getAnnotation(HttpTest.class)).method(); Response result = null; if (requestMethod.equals(Method.GET)) result = request.get(); else if (requestMethod.equals(Method.POST)) result = request.post(); else if (requestMethod.equals(Method.DELETE)) result = request.delete(); else if (requestMethod.equals(Method.PUT)) result = request.put(); else if (requestMethod.equals(Method.HEAD)) result = request.head(); else if (requestMethod.equals(Method.OPTIONS)) { result = request.options(); } return result; } public void tryInjectResponse(Response response) { Field[] fields = this.target.getClass().getDeclaredFields(); for (Field field : fields) { Context contextAnnotation = (Context) field .getAnnotation(Context.class); if ((contextAnnotation != null) && (field.getType() == Response.class)) injectResponse(field, response); } } private void injectResponse(Field field, Response response) { field.setAccessible(true); try { field.set(this.target, response); } catch (Exception exception) { throw new IllegalStateException("Could not inject response.", exception); } } }
可以看出HttpTestStatement起了关键作用
1.setProxyProperties可以看出请求代理的处理.
2.doEvaluate回调和Poll的实现.
3.sendRequest处理了请求调用的过程
4.injectResponse注入单元测试的功能.
HttpTestStatement是怎样被RestFuse调用的呢?
1.首先在执行单元测试类中定义Destination.
2.执行单元执行的使用调用Rule.
3.Rule调用Statement.
4.Statement执行最后调用测试单元.
相关推荐
**Junit源码分析(圣思园)** Junit是Java编程语言中最广泛使用的单元测试框架,它使得开发者能够方便地编写和运行可重复的、可靠的测试用例。本篇文章将深入探讨Junit的源码,揭示其内部工作原理,帮助我们更好地...
JUnit是Java编程语言中最常用的单元测试框架之一,它为开发者提供了编写可重复执行的、可靠的测试用例的工具。在Junit中,设计模式的应用极大地增强了其灵活性和可扩展性。下面我们将深入探讨Junit中涉及到的设计...
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage,包含依赖包:junit-jupiter-5.5.1.jar,junit-jupiter-engine-5.5.1.jar,junit-jupiter-params-5.5.1.jar,junit-platform-launcher-1.5.1.jar,junit-...
本资源"Junit设计模式分析(带源码)"旨在深入探讨JUnit在设计上的模式和最佳实践,通过源码分析帮助开发者更好地理解和应用这个工具。 1. 单元测试基础: 单元测试是对软件中的最小可测试单元进行检查,如函数、...
Files contained in junit4-...org.junit.runners.model.Statement.class org.junit.runners.model.TestClass.class org.junit.runners.package-info.class org/hamcrest/core/package.html org/hamcrest/package.html
JUnit是Java开发者进行单元测试的重要工具,由著名程序员Erich Gamma和Kent Beck共同创建,它遵循简洁、可扩展的原则,使得测试代码易于...因此,深入研究JUnit的设计模式对于提升Java开发者的技能水平具有重要意义。
junit4.1junit4.1junit4.1junit4.1junit4.1
JUnit API JUnit API JUnit API JUnit API JUnit API
这个名为"junit5.jar"的文件正是JUnit 5的核心库,它包含了执行单元测试所需的所有核心组件,包括JUnit Platform、JUnit Jupiter和JUnit Vintage。本文将全面解析JUnit 5的关键特性和使用方法。 首先,JUnit ...
JUnit 设计模式分析 本文将对 JUnit 设计模式进行深入分析,探讨 JUnit 中的设计模式应用,了解 JUnit 是如何使用设计模式来实现测试框架的。 一、JUnit 概述 JUnit 是一个优秀的 Java 单元测试框架,由 Erich ...
通过研究和实践这个资源中的内容,开发者不仅可以深入了解JUnit5的内部机制,还可以掌握如何编写高效、可维护的单元测试,从而提升软件质量。对于初学者,建议先从`demo-junit-5-master.zip`开始,通过实例学习JUnit...
"JUnit in Action 3rd Edition" JUnit是一种流行的Java单元测试框架,由Kent Beck和Eric Gamma于1997年创立。JUnit在软件测试领域中扮演着重要的角色,帮助开发者编写高质量的代码。下面是关于JUnit的重要知识点: ...
标题 "JUnit -- 分析" 指向的是对JUnit这个著名的Java单元测试框架的深入探讨。JUnit是一个开源的、基于Java的测试框架,它使得开发者能够编写可重复运行的、结构化的测试用例,以验证代码的功能正确性。这篇分析...
从标签“源码 工具”我们可以推断,这篇研究可能涵盖了Junit的源码分析以及可能涉及到的辅助工具,如代码生成工具,用于自动生成测试代码的库或者插件。源码分析有助于理解Junit内部的工作机制,而工具的使用则可能...