使用mock objects进行测试,应用控制反转(Ioc)模式替换一个HTTP连接测试代码
代码:ConnectionFactory.java
[...]
import java.io.InputStream;
public interface ConnectionFactory{
InputStream getInputStream() throws Exception;
}
凡是实现ConnectionFactory接口的都返回一个InputStream对象,这就为控制反转,替换HTTP连接的mock 技术提供了核心的基础.
代码:WebClient.java
[...]
import java.io.InputStream;
public class WebClient{
public String getContent(ConnectionFactory connectionFactory){
String content=new StringBuffer();
try{
InputStream is=connectionFactory.getInputStream();
int count;
while(-1 != (count=is.read())){
content.append(new String(Charater.toChars(count)));
}
}catch(Exception e){
return null;
}
return content.toString();
}
}
我们使用的任何资源都需要传给WebClient的getContent方法,这就意味着讲HttpURLConnection对象的创建任务交给了WebClient的创建者.
代码:HttpURLConnectionFactory.java
[...]
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionFactory implements ConnnectionFatory {
private URL url;
public HttpURLConnectionFactoty(URL url){
this.url=url;
}
public InputStream getInputStream() throws Exception{
HttpURLConnection connection=(HttpURLConnection) this.ulr.openConnection();
return connection.getInputStream();
}
}
代码:MockConnectionFactory.java
[...]
import java.io.InputStream;
public class MockConnectionFatory implements ConnectionFatory{
private ImputStream inputSteam;
public void setInputStream(InputSteam inputStream){
this.inputSteam=inputSteam;
}
public InputSteam getInputSteam() throws Exception{
return this.inputSteam;
}
}
这里的MockConnectionFatory对象利用了junit的mock objects技术,替换了HttpURLConnectionFactory
再利用控制反转技术,向测试类WebClient的getContent方法注入mock对象,巧妙的隔离WEB资源,对getContent方法进行单元测试
代码:TestClient.java
[...]
import java.io.ByteArrayInputStream;
public class TestWebClient{
@Test
public void testGetConnent() throws Exception{
MockConnectionFactory mockConnectionFactory=new MockConnectionFatory();
mockConnectionFactory.setInputStream(new ByteArrayInputStream("it works".getBytes()));
WebClient webClient=new WebClient();
String result=client.getContent(mockConnectionFactory);
assertEqual("it works",result);
}
}