当没有接口时、不可继承时,如果使用mock方案进行单元测试
原版代码:
import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /* 7.4 替换一个HTTP连接 学习到如何为没有Java接口的类(即HttpURLConnection类)编写mock。 */ public class WebClient { 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(); } }
采用方法工厂重构:
import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /* 第一次重构 */ public class WebClient1 { public String getContent (URL url){ StringBuffer content = new StringBuffer(); try{ HttpURLConnection connection = createHttpURLConnection(url); 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(); } protected HttpURLConnection createHttpURLConnection(URL url) throws IOException { return (HttpURLConnection)url.openConnection(); } }
对其的测试:
import org.junit.Test; import java.net.HttpURLConnection; import java.net.URL; /* public class TestWebClient1 { @Test public void testGetContentOk() throws Exception{ MockHttpConnection mockHttpConnection = new MockHttpConnection(); mockHttpConnection.setExpectedInputStream(new Byt 、、、 } private class TestableWebClient1 extends WebClient1{ private HttpURLConnection connection; public void setHttpURLConnection(HttpURLConnection connection) { this.connection=connection; } public HttpURLConnection createHttpURLConnection(URL url) { return this.connection; } } } */
采用类工厂重构:
import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; interface ConnectionFactory{ InputStream getData() throws Exception; } public class WebClient2 { public String getContent (ConnectionFactory factory){ StringBuffer content = new StringBuffer(); try{ InputStream in = factory.getData(); 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; } catch (Exception e) { e.printStackTrace(); } return content.toString(); } }
对其的测试:
import org.junit.Test; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.sql.Connection; public class TestWebClient2 { @Test public void testGetContentOk(){ } public class HttpURLConnectionFactory implements ConnectionFactory{ private URL url; public HttpURLConnectionFactory(URL url) { this.url = url; } public InputStream getData() throws Exception { HttpURLConnection connection = (HttpURLConnection)this.url.openConnection(); return connection.getInputStream(); } } public class MockURLConnectionFactory implements ConnectionFactory{ private InputStream inputStream; public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } public InputStream getData() throws Exception { return inputStream; } } }
当没有接口时、不可继承时,如果使用mock方案进行单元测试的更多相关文章
- C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?
摘要 我们都知道,C#中,在类型继承时,由于构造子类必须先构造其父类型的内容,因此,必须子类型的构造函数中调用父类型的构造函数(无参数的不需要显式声明). 但是往往我们会出现,子类型本身的构造函数大于 ...
- C++使用继承时子对象的内存布局
C++使用继承时子对象的内存布局 // */ // ]]> C++使用继承时子对象的内存布局 Table of Contents 1 示例程序 2 对象的内存布局 1 示例程序 class ...
- JAVA继承时this和super关键字
JAVA继承时this和super关键字 本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数. 在子类中指定this关键字.首先在本类中查找,如果本类中找不到,再在父 ...
- JAVA中继承时方法的重载(overload)与重写/覆写(override)
JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...
- Java继承时的初始化顺序
Java程序在启动和运行时,需要首先完成初始化的工作.在涉及到继承.static成员变量等因素时,初始化的顺序就复杂起来.下面以一个例子说明继承时的Java初始化顺序. 例子: class Insec ...
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...
- c/c++ 继承与多态 继承时如何改变个别成员的访问属性
问题1:若类B以private的方式继承类A,但还想让类A的某些个别成员,保持public或者protected的访问属性,这时应该怎么办? 使用using,去改变访问属性. #include < ...
- C++类有继承时,析构函数必须为虚函数
C++类有继承时,析构函数必须为虚函数.如果不是虚函数,则使用时可能存在内在泄漏的问题. 假设我们有这样一种继承关系: 如果我们以这种方式创建对象: SubClass* pObj = new SubC ...
- Lombok 继承时应注意的点
lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法.即它最终能够达到的效果是:在源码中没 ...
随机推荐
- vs调试cordova app时 scriptedsandbox64.exe已停止工作的错误处理方法
1.把ie更新到版本11 2.去掉 选项->调试->调试时启动诊断工具 有时候调试会启动失败,提示版本过低,再一次点击调试就可以了.
- Win10《芒果TV》更新v3.5.0夏至版:会员尊享蓝光画质,关联本地视频播放
在Win10秋季创意者更新前夕,Win10版<芒果TV>全平台同步更新夏至版v3.5.0,新增会员蓝光画质,关联本地视频播放,进一步提升使用体验. Win10版<芒果TV>V3 ...
- Windows10 【系统周期表】【系统下载表】【大型软件表】
系统周期表 商用名称 商用英文名 代号 版本 系统版本 上市日期 服务周期 备注 Windows 10 无 Threshold 1 1507 10.0.10240.17443 2015.07.29 2 ...
- WIN10从2016.11开始就强制驱动必须要求经过WHQL认证,而2015的win10就没有问题
http://www.whqlchina.com/whql-news/whql-following/ https://www.zhihu.com/question/45586031 https://a ...
- List.Sort() 小小技巧--- 从大到小排列
List.sort() 默认的情况下是从小到大的排列. 例如: List<int> list = new List<int>(); list.Add(- ...
- Android零基础入门第9节:Android应用实战,不懂代码也可以开发
原文:Android零基础入门第9节:Android应用实战,不懂代码也可以开发 通过上一期的学习,我们成功开发了Android学习的第一个应用程序,不仅可以在Android模拟器上运行,同时还能在我 ...
- 用Delphi实现文件下载的几种方法(三种使用控件的方法)
有个API就是UrlDownloadToFile.不仅如此,Delphi的一些控件也可以轻松实现下载,如NMHTTP,指定NMHTTP1.InputFileMode := ture; 指定Body为本 ...
- HTML连载15-文本属性&颜色控制属性
一.文本装饰的属性 1.格式:text-decoration:underline; 2.取值: (1)underline代表下划线 (2)line-through代表删除线 (3)overline代表 ...
- Tido 习题-二叉树-树状数组求逆序对
这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述 样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示 #include<iostream ...
- 使用 Python 识别并提取图像中的文字
1. 介绍 介绍使用 python 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情. 2. 必备工具 tesseract-ocr 下载地址: https://github. ...