实验五 2 使用JUnit执行stub和mock object测试.doc
文本预览下载声明
实践 使用JUnit执行stub和mock object测试
第一部分:用stub测量来测试代码。
stub:是代码的一部分。运行时我们用stub替换真正代码,忽略调用代码的实现。目的是用简单一点的行为替换一个复杂的行为,从而允许独立的测试代码的某一个部分。
使用stub的情况:
你不能修改一个现有系统,因为它很复杂,很容易崩溃。
进行粗粒度测试,如在不同系统间进行集成测试。
不使用stub的情况:
stub本身可能很复杂,自身就需要调试。
因为stub的复杂,可能会很难维护。
stub不能很好的运用于细粒度测试。
不同的情况需要不同策略来测试。
例子:一个HTTP连接的例子:WebClient类通过调用自身的String getContent(URL url)方法来获得远程Web服务器上的对应的URL的内容。
这里WebClient中getContent()方法的典型代码如下:
import .URL;
import .HttpURLConnection;
import java.io.InputStream;
import java.io.IOException;
public class WebClient {
public String getContent(URL url) {
StringBuffer content = new StringBuffer();
try {
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoInput(true);
InputStream is = connection.getInputStream();
byte[] buffer = new byte[2048];
int count;
while (-1 != (count = is.read(buffer))) {
content.append(new String(buffer, 0, count));
}
} catch (IOException e) {
return null;
}
return content.toString();
}
}
一种策略就是使用Web服务器,将测试的内容绑定在此服务器上,然后通过WebClient来连接并取得内容,然后验证这些内容与放入服务器的内容是否一致。这样做的问题就是维护很困难,而且测试代码分散在各个地方。
另一种策略是使用轻量级的Web服务器,这类服务器专门用于简单的服务情况,如嵌入式Web服务器或专门用于调试的服务器,Java高级开发中可以使用Jetty服务器作为专门的调试用服务器,其启动很快,而且可以对服务器进行定制。这部分练习可参阅补充内容。
我们这里提供另外一种方案,劫持连接,将HTTP连接替换掉,换成我们自己的stub连接。JDK的URL和HttpURLConnection类允许引入自定义的协议处理器,处理任何类型的通讯协议。可以将任何对HttpURLConnection类的调用转向到自己的测试类。
为实现自定义的URL协议处理器,需要调用以下JDK方法,传入自定义的URLStreamHandlerFactory对象:
.URL.setURLStreamHandlerFactory(.URLStreamHandlerFactory);
当调用URL.openConnection()方法,URLStreamHandlerFactory就被调用,并返回一个URLStreamHandler对象。
为测试提供自定义的流处理器:
import junit.framework.TestCase;
import .URL;
import .URLStreamHandlerFactory;
import .URLStreamHandler;
import .URLConnection;
import java.io.IOException;
public class TestWebClient extends TestCase {
protected void setUp() {
URL.setURLStreamHandlerFactory(new StubStreamHandlerFactory());
}
private class StubStreamHandlerFactory implements URLStreamHandlerFactory {
public URLStreamHandl
显示全部