利用stub技术进行单元测试
待测试类:WebClient:
import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL;public class WebClient {/*测试时的几个要点:1.这个方法有两个出口:a.正常情况下,返回从服务器发回来的数据b.如果getInputStream出错,返回一个nullc.如果read出错,则返回一个null*/public String getContent (URL url){StringBuffer content = new StringBuffer();try{HttpURLConnection connection = (HttpURLConnection)url.openConnection();connection.setDoInput(true);InputStream in = connection.getInputStream();byte[] buffer = new byte[2048];int count;while (-1 != (count = in.read(buffer))) {content.append(new String(buffer,0,count));}} catch (IOException e) {return null;}return content.toString();} }
使用stub替换web资源的测试方法:
import org.junit.*; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.AbstractHandler; import org.mortbay.jetty.servlet.Context;import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL;import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull;/*这种测试的核心思想就是,在我的测试过程中,搭建一个服务器,并在服务器上备上资源,,我测试的方法,将会来访问我这个服务器,由于服务器中的资源是我自己准备的,所以我可以对获取的资源的正确性进行判断。这个测试用到的比价有技术含量的点有:1.内嵌式服务器Jetty,这个我只需要研究一下Jetty配置自己的处理器在正式开始整理之前,先回忆一下Tomcat中server.xml标签中说的一些关系:host中有许多个contextengine中有许多个hostservice中有多个connector与一个Engineserver中有多个service我注意到一件事情,在使用Jetty时,作者总是先New出一个Server来,在Server中设置端口号8080.这个已经和Tomcat有点不一样了。其次Tomcat中是在web.xml中配置servlet与url的匹配,但是Jetty中是先New出一个Context,然后将server及相应的url传入。最后调用setHandler()方法,设置该url的处理类。Tomcat中Context中的概念貌似和Jetty中的Context是类似的。我没有细究,但是我记得在写Servlet时,我们总是用到一些Context中的参数。这部分以后再复习一下吧。感觉把这些东西分析完了,自己也就理解了Jetty配置的过程。*/ @Ignore public class TestWebClient {@BeforeClasspublic static void setUp() throws Exception {Server server = new Server(8080);TestWebClient t = new TestWebClient();Context contextOkContext = new Context(server,"/textGetContentOk");contextOkContext.setHandler(t.new TestGetContentOkHandler());Context contextNotFoundContext = new Context(server, "/testGetContentNotFound");contextNotFoundContext.setHandler(t.new TestGetContentNotFoundHandler());server.setStopAtShutdown(true);server.start();}private WebClient client;@Beforepublic void ready(){client = new WebClient();}@Testpublic void testGetContentOk() throws Exception{String result = client.getContent(new URL("http://localhost:8080/textGetContentOk"));assertEquals("It works",result);}@Testpublic void testGetContentNotFound() throws MalformedURLException {String result = client.getContent(new URL("http://localhost:8080/testGetContentNotFound"));assertNull(result);}@AfterClasspublic static void tearDown(){}public class TestGetContentOkHandler extends AbstractHandler {public void handle(String s, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, int i) throws IOException, ServletException {OutputStream out = httpServletResponse.getOutputStream();/*这个地方的写法和我以前看到的不一样哦*/ // ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer(); // writer.write("It works"); // writer.flush();/*感觉有必要把HTTP学习一下了*/ // httpServletResponse.setIntHeader(HttpHeaders.CONTENT_LENGTH,writer.size()); // writer.writeTo(out); // out.flush();/*我擦嘞,什么鬼,作者花式秀,结果还是错的,我这简简单单的一写,既然是对的*/out.write("It works".getBytes("iso-8859-1"));out.flush();}}public class TestGetContentNotFoundHandler extends AbstractHandler{public void handle(String s, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, int i) throws IOException, ServletException {httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);}}}
利用替换连接的方法:
import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test;import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.*;import static org.junit.Assert.assertEquals;/*第二个方案:替换连接该方案的核心技术是,利用Java中URL和HttpURLConnection类,我们引入自定义的协议处理器来处理任何类型的通信协议。技术要点:1.为了实现一个自定义的URL协议处理器,你需要调用URL的setURLStreamHandlerFactory方法,并传递给它一个自定义的URLStreamHandlerFactory。无论何时调用URL的openConnection方法,都会调用URLStreamHandlerFactory类,返回一个URLStreamHandler对象。(之前在getContent中调用这个方法时,得到的是一个connection对象,现在说是一个URLStreamHandler对象,有点奇怪的哦。)public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)设置应用程序的 URLStreamHandlerFactory。在一个给定的 Java 虚拟机中,此方法最多只能调用一次。URLStreamHandlerFactory 实例用于从协议名称构造流协议处理程序。public URLStreamHandler createURLStreamHandler(String protocol)创建具有指定协议的新 URLStreamHandler 实例。*/public class TestWebClient1 {@BeforeClasspublic static void setUP(){TestWebClient1 t = new TestWebClient1();URL.setURLStreamHandlerFactory(t.new StubStreamHandlerFactory());}@Testpublic void testGetContentOk() throws MalformedURLException {WebClient client = new WebClient();String result = client.getContent(new URL("http://loalhost"));assertEquals("It works",result);}private class StubHttpURLConnection extends HttpURLConnection {private boolean isInput = true;public StubHttpURLConnection(URL u) {super(u);}/*你想要的流里,我已经给你放好的东西。*/@Overridepublic InputStream getInputStream() throws IOException {if(!isInput){new ProtocolException("Wrong in isInput...");}ByteArrayInputStream bais = new ByteArrayInputStream("It works".getBytes("ISO-8859-1"));return bais;}public void disconnect() {}public boolean usingProxy() {return false;}public void connect() throws IOException {}}private class StubStreamHandlerFactory implements URLStreamHandlerFactory{public URLStreamHandler createURLStreamHandler(String protocol) {return new StubHttpURLStreamHandler();}}private class StubHttpURLStreamHandler extends URLStreamHandler{protected URLConnection openConnection(URL u) throws IOException {return new StubHttpURLConnection(u);}} }
《Junit实战》笔记
转载于:https://www.cnblogs.com/junjie2019/p/10622797.html
利用stub技术进行单元测试相关推荐
- 大淘宝用户平台技术团队单元测试建设
单元测试是工程交付前质量保障的第一环,也无疑是软件工程质量保障的重要基石,有效的单元测试能够提前发现90%以上的代码Bug问题,同时也能防止代码的腐化,在工程重构演进时起到至关重要的作用. 为什么需要 ...
- 淘系用户平台技术团队单元测试建设
简介:单元测试是工程交付前质量保障的第一环,也无疑是软件工程质量保障的重要基石,有效的单元测试能够提前发现90%以上的代码Bug问题,同时也能防止代码的腐化,在工程重构演进时起到至关重要的作用. 作者 ...
- 归一化激活层的进化:谷歌Quoc Le等人利用AutoML 技术发现新型ML模块
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 最近,谷歌大脑团队和 DeepMind 合作发布了一篇论文,利用 AutoML 技 ...
- 美国银行将 AI 应用于企业应收账款处理;联合国或将利用机器学习技术帮助救灾工作...
8 月 24 日消息,据外媒报道,美国银行(Bank of America)与 Fintech 创业公司 High Radius达成合作,将人工智能应用于企业应收账款处理.该应用程序专为大型.复杂的公 ...
- 深度学习核心技术精讲100篇(二十七)-如何利用NLP技术对ASR的query文本进行预处理纠错?
前言 语音系统中语音内容识别 ( ASR ) 的精准性,是影响智能语音产品发展的关键制约因素,用户query的文本,通常是由ASR系统将用户的语音命令转换而成,但由于技术上的原因,这些由ASR生成的文 ...
- 利用K8S技术栈打造个人私有云(连载之:K8S资源控制)
[利用K8S技术栈打造个人私有云系列文章目录] 利用K8S技术栈打造个人私有云(连载之:初章) 利用K8S技术栈打造个人私有云(连载之:K8S集群搭建) 利用K8S技术栈打造个人私有云(连载之:K8S ...
- 利用反射技术修改类中的字段(成员变量的反射)
题目:利用反射技术修改类中的字段及成员变量的反射 作者:Vashon 一.首先定义一个类如下: class ReflectPoint {private int x; //私有的public int y ...
- 爬虫侵入计算机系统,【探讨】利用“爬虫技术”获取数据行为的刑事考量 ——以一起非法获取计算机信息系统数据案为例...
在本案中最为主要的争议焦点是"公开的信息"是否属于非法获取计算机信息系统数据中的犯罪对象.非法获取计算机信息系统数据罪的保护法益是计算机信息系统安全和数据安全.那么信息是否等同于数 ...
- java类作为多层级的数据实体_API json多层数据实体类封装(利用泛型技术)
完整源码查看点击进入:github地址 1: API json多层数据实体类封装(利用泛型技术) RootEntity.java public class RootEntity{ private in ...
最新文章
- LeetCode 集锦(二十二) - 第 101 题 Symmetric Tree
- 三角形的几何公式大全_数学老师精心整理:小学四年级公式大全,各个知识点逢考必有...
- vue 转为静态html,Vue CLI 3使用:HTML和静态资源(五)
- nodejs操作sqlserver数据_nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例...
- python环绕文字_如何用css实现文字三面环绕图片?
- android APP优化知识图谱
- linux性能架构,Linux性能及调优指南(翻译)之Linux内存架构
- 错误:cc1: error: unrecognized command line option “-m32”
- Linux动态链接库隔离,Linux下的.so文件是动态链接库
- 游戏开发之C++IO流(C++基础)
- mybatis-plus修改操作(自动填充)
- ActiveMQ 持久化
- linux邮件客户端软件,适用于Linux的4款最佳电子邮件客户端 | MOS86
- 系统分析师2020年真题解析
- Java基础面试题(持续更新)
- stm32 代码加密
- oracle数据库有哪些权限,ORACLE数据库中权限有哪些?
- 怎么根据读到的ADC值,推算实际电压值(一)
- 学计算机人都很自私,心理学家:内心极度虚伪的人,往往都有这三个特征,趁早远离!...
- K - Period(周期)