使用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);
}
}
分享到:
相关推荐
- **使用MockObjects添加缺失的断言**:演示如何通过MockObjects来模拟对象行为并增加新的断言。 - **性能与可扩展性**:利用JUnit Perf来提升测试的性能和可扩展性。 - **Daedalos JUnit扩展**:介绍Daedalos...
- **测试套件(Test Suite)**:通过@TestSuite注解,可以组合多个测试用例或测试类进行批量执行。 3. **JUnit关键特性**: - **注解(Annotation)**:JUnit4引入了注解,如@Test、@Before、@After、@...
- **高级主题**:除了基础内容外,本书还介绍了如何使用模拟对象(mock objects)和存根(stubs),进一步扩展读者对软件设计的理解。 - **读者反馈**: - **JavaRanch.com**:本书被赞誉为“编写Java EE组件单元...
3. **Mock对象**:在测试中,模拟对象(Mock Objects)用于隔离被测试代码,确保测试的准确性。可能会讲解如何使用Mockito等库创建和使用Mock对象。 4. **TestNG**:除了JUnit,还有TestNG这样的高级测试框架,提供...
- **最佳实践**:介绍了一些常见的最佳实践,如使用模拟对象(mock objects)和桩(stubs),以及如何通过这些技术改进软件设计。 - **模式应用**:通过工厂方法等设计模式的应用,展示如何通过改进代码结构来支持更好的...
此外,作者还分享了一些实战技巧,比如如何设计测试用例覆盖各种边界条件,以及如何利用模拟对象(mock objects)和存根(stubs)来隔离测试对象,确保测试的独立性和准确性。 #### 进阶主题探讨 对于已经具备一定...
测试技巧包括使用测试桩(test stubs)和模拟对象(mock objects)。测试桩可以替换实际的代码,简化测试场景;模拟对象则模拟与被测试代码交互的对象,仅提供最基本的行为响应,以验证被测试代码的行为。 编写有效...
2. 隔离被测代码:使用模拟对象(mock objects)或存根(stubs)来隔离被测单元,避免外部依赖影响测试结果。 3. 确保可重复性:测试应始终给出一致的结果,不受环境变化的影响。 4. 全覆盖:尽可能覆盖所有代码路径...
例如,我们可以创建模拟对象(Mock Objects)来代替真实的数据库访问对象,如`MockDatabaseDao1`和`MockDatabaseDao2`,它们记录下被调用的方法和参数。在测试`noOutputMethod`时,通过检查模拟对象的记录,我们可以...
7. **模拟与依赖注入**:在测试中可能需要使用模拟对象(Mock Objects)或依赖注入,以隔离被测试代码,避免真实环境的依赖影响测试结果。 8. **TDD工作流**:红-绿-重构循环,以及如何在实践中平衡开发速度与代码...
这些例子将展示如何使用不同的测试框架(如JUnit、pytest等)来编写测试,以及如何利用模拟对象(mock objects)和存根(stubs)来隔离被测试代码。 此外,源代码可能还包括涉及TDD的其他技术,如边界条件测试、...
3. **涵盖高级主题**:书中不仅包括了基础的单元测试技巧,还涵盖了模拟对象(Mock Objects)、存根(Stubs)等高级主题,帮助读者深入了解软件设计的核心概念。 4. **代码重构建议**:本书还提供了一些关于如何重构...
测试框架如JUnit(Java)、pytest(Python)或NUnit(.NET)在编写测试类时非常有用,它们提供了断言、测试运行控制以及报告生成等功能。此外,模拟和桩对象(Mock Objects和Stub Objects)也可能被用来隔离被测试的...