juint测试之类工厂重构 mock objects测试

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值