当没有接口时、不可继承时,如果使用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等方法.即它最终能够达到的效果是:在源码中没 ...
随机推荐
- Linux下获取arm的交叉编译工具链
转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gne ...
- List.Sort() 小小技巧--- 从大到小排列
List.sort() 默认的情况下是从小到大的排列. 例如: List<int> list = new List<int>(); list.Add(- ...
- 什么是DirectShow?
DirectShow是微软出的用于流媒体开发的开发包.开发语言是C++,没提供C#接口的调用方式.
- C#获取应用路径的一些方法
// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...
- 中国2017 Google 开发者大会第二天简单回顾
昨天早晨发布了第一天的开发者大会回顾文章后,就匆匆忙忙赶去会场继续享受高科技的盛宴,接下来简单回顾一下第二天的大会参与情况. 昨天早晨下着小雨,并带着微风,在外面还是挺冷的,这里不得不给工作人员点个赞 ...
- spring.net的简单使用(三)创建对象
这篇主要说对象的创建方式. spring.net提供了三种创建对象的方式,分别是构造器创建,静态工厂创建,实例工厂创建. 多数的情况下,容器会根据对象定义中type属性值去直接调用相应类型的某个构造器 ...
- 通过内核对象在服务程序和桌面程序之间通信的小问题 good
关于在通过 事件对象 在服务程序和普通桌面应用程序相互之间通信的问题,分类情况进行讨论:1.普通桌面应用程序中创建事件,服务程序中打开事件 XP的情况普通桌面应用程序中创建: m_hEvent = : ...
- 3023Java_控制语句
控制语句 0.前定义 语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句. 块确定了局部变量的作用域.块中的程序代码,作为一个整体,是要被一起执行的. 块可以被嵌套在另一个块中,但 ...
- 修改npm默认安装路径
npm config ls npm config set prefix D:\ag\npm
- 第一章 corejava的入门
第一章 corejava的入门一:什么是语言语言=os+数据结构+算法+思想os:操作系统数据结构:队,栈,二叉树,链表算法:做游戏开发时非常重要面试题:int a>0,b>0只使用一条输 ...