使用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); } }