`
aasonwu
  • 浏览: 35242 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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



分享到:
评论

相关推荐

    测试驱动开发 英文参考书

    - **使用MockObjects添加缺失的断言**:演示如何通过MockObjects来模拟对象行为并增加新的断言。 - **性能与可扩展性**:利用JUnit Perf来提升测试的性能和可扩展性。 - **Daedalos JUnit扩展**:介绍Daedalos...

    Junit良葛格学习笔记

    - **测试套件(Test Suite)**:通过@TestSuite注解,可以组合多个测试用例或测试类进行批量执行。 3. **JUnit关键特性**: - **注解(Annotation)**:JUnit4引入了注解,如@Test、@Before、@After、@...

    junit in action 2nd edtion

    - **高级主题**:除了基础内容外,本书还介绍了如何使用模拟对象(mock objects)和存根(stubs),进一步扩展读者对软件设计的理解。 - **读者反馈**: - **JavaRanch.com**:本书被赞誉为“编写Java EE组件单元...

    aglie java测试驱动开发敏捷经典(1)教程部分

    3. **Mock对象**:在测试中,模拟对象(Mock Objects)用于隔离被测试代码,确保测试的准确性。可能会讲解如何使用Mockito等库创建和使用Mock对象。 4. **TestNG**:除了JUnit,还有TestNG这样的高级测试框架,提供...

    Junit in action 2nd edition

    - **最佳实践**:介绍了一些常见的最佳实践,如使用模拟对象(mock objects)和桩(stubs),以及如何通过这些技术改进软件设计。 - **模式应用**:通过工厂方法等设计模式的应用,展示如何通过改进代码结构来支持更好的...

    pragmatic programmers:pragmatic unit testing in java with junit

    此外,作者还分享了一些实战技巧,比如如何设计测试用例覆盖各种边界条件,以及如何利用模拟对象(mock objects)和存根(stubs)来隔离测试对象,确保测试的独立性和准确性。 #### 进阶主题探讨 对于已经具备一定...

    单元测试的必要性和重要性

    测试技巧包括使用测试桩(test stubs)和模拟对象(mock objects)。测试桩可以替换实际的代码,简化测试场景;模拟对象则模拟与被测试代码交互的对象,仅提供最基本的行为响应,以验证被测试代码的行为。 编写有效...

    有关单元测试的培训资料

    2. 隔离被测代码:使用模拟对象(mock objects)或存根(stubs)来隔离被测单元,避免外部依赖影响测试结果。 3. 确保可重复性:测试应始终给出一致的结果,不受环境变化的影响。 4. 全覆盖:尽可能覆盖所有代码路径...

    单元测试实践小结(很详细)

    例如,我们可以创建模拟对象(Mock Objects)来代替真实的数据库访问对象,如`MockDatabaseDao1`和`MockDatabaseDao2`,它们记录下被调用的方法和参数。在测试`noOutputMethod`时,通过检查模拟对象的记录,我们可以...

    测试驱动开发 多币种实例2.笔记

    7. **模拟与依赖注入**:在测试中可能需要使用模拟对象(Mock Objects)或依赖注入,以隔离被测试代码,避免真实环境的依赖影响测试结果。 8. **TDD工作流**:红-绿-重构循环,以及如何在实践中平衡开发速度与代码...

    TDD相关测试源代码,学习测试的好资源

    这些例子将展示如何使用不同的测试框架(如JUnit、pytest等)来编写测试,以及如何利用模拟对象(mock objects)和存根(stubs)来隔离被测试代码。 此外,源代码可能还包括涉及TDD的其他技术,如边界条件测试、...

    Manning.JUnit.in.Action.2nd.Edition.Jul.2010.pdf正式版

    3. **涵盖高级主题**:书中不仅包括了基础的单元测试技巧,还涵盖了模拟对象(Mock Objects)、存根(Stubs)等高级主题,帮助读者深入了解软件设计的核心概念。 4. **代码重构建议**:本书还提供了一些关于如何重构...

    JustTest代码类

    测试框架如JUnit(Java)、pytest(Python)或NUnit(.NET)在编写测试类时非常有用,它们提供了断言、测试运行控制以及报告生成等功能。此外,模拟和桩对象(Mock Objects和Stub Objects)也可能被用来隔离被测试的...

Global site tag (gtag.js) - Google Analytics