`

easymock教程-创建stub对象

 
阅读更多


    前面教程中有个章节讨论到mock和stub的概念差别,一般来说easymock如其名所示,主要是用来做mock用的,但是easymock中也提供有对stub的支持, 主要体现在andStubAnswer(),andStubDelegateTo(),andStubReturn(),andStubThrow()和asStub()等方法的使用上。

 

    我们来看一个实际使用的例子:

 

    public class Business {
        
private Service     service;

        
private StubService stubService;

        
public void execute1() {
            
if (service.execute()) {
                stubService.method1();
            }

        }


        
public void execute2() {
            
if (service.execute()) {
                stubService.method2();
            }

        }


        
public void execute3() {
            
if (service.execute()) {
                stubService.method1();
                stubService.method2();
            }

        }


        
public void setStubService(StubService stubService) {
            
this.stubService = stubService;
        }


        
public void setService(Service service) {
            
this.service = service;
        }

    }


    
private interface Service {
        
public boolean execute();
    }


    
private interface StubService {

        
public String method1();

        
public String method2();
    }

    这里的Business类依赖到Service和StubService,execute1() / execute2() / execute3() 是我们需要测试的三个方法,相同点都是必须调用service.execute(),不同点在于其后对stubService的调用各不相同。而我们假设在这里我们只关心Business类对Service的调用是否如预期,不关心对于StubService的调用,只要程序可以继续运行就可以了。

 

    一个正统的做法是手工写一个StubService的stub 实现,例如:

private class StubServiceImpl {
 
public String method1() {
  
return "";
 }


 
public String method2() {
  
return "";
 }

}


    但是如果这个接口复杂方法众多,则这个stub类不得不实现所有的其他方法,即使完全用不到,因为java的语法限制。

 

    可以这样使用easymock来实现stub:

 

public class BusinessTest {

    
private Business      business;

    
private IMocksControl mocksControl;

    
private Service       service;

    @Before
    
public void init() {
        business 
= new Business();
        business.setStubService(prepareStubService());
        mocksControl 
= EasyMock.createStrictControl();
        service 
= mocksControl.createMock("service", Service.class);
        business.setService(service);
    }


    
private StubService prepareStubService() {
        StubService service 
= EasyMock.createMock("stubService", StubService.class);
        service.method1();
        EasyMock.expectLastCall().andStubReturn(
"");
        service.method2();
        EasyMock.expectLastCall().andStubReturn(
"");
        EasyMock.replay(service);
        
return service;
    }


    @Test
    
public void testExecute1() {
        EasyMock.expect(service.execute()).andReturn(
true);
        mocksControl.replay();
        business.execute1();
        mocksControl.verify();
    }


    @Test
    
public void testExecute2() {
        EasyMock.expect(service.execute()).andReturn(
false);
        mocksControl.replay();
        business.execute2();
        mocksControl.verify();
    }


    @Test
    
public void testExecute3() {
        EasyMock.expect(service.execute()).andReturn(
true);
        mocksControl.replay();
        business.execute3();
        mocksControl.verify();
    }

}

 

    在方法prepareStubService()中,我们通过easymock创建了一个mock对象,然后和普通mock对象一样记录了期望的行为。不同的是用andStubReturn()替代了andReturn().

 

    然后我们直接调用EasyMock.replay(service),注意在这个测试案例中,我们另外创建了一个mocksControl并通过这个mocksControl创建了我们关注的Service接口的mock对象,它的record/replay/和verify()是和StubService完全分离的。这样做的好处是在execute1() / execute2() / execute3()的测试案例中,我们完全不必额外关心这个stub,所有的事情在init()函数中就已经准备好了。这样做的好处显而易见,execute1() / execute2() / execute3()的测试案例中,代码和测试逻辑都简单了。

 

    最后总结,在适当的时候使用easymock来创建stub对象,对于简化测试还是能有所帮助的。

分享到:
评论

相关推荐

    easymock详解教程

    #### 1.9 easymock教程-创建stub对象 除了创建mock对象外,easymock还支持创建stub对象。stub对象主要用于模拟简单的行为,如返回固定的值或抛出异常。 - **创建stub对象**:可以使用`EasyMock.createStub`方法来...

    easymock教程.pdf

    * 使用easymock的createStub方法创建Stub对象。 * 使用Stub对象可以模拟真实对象的部分行为。 ### 放宽调用次数 * 使用easymock的anyTimes方法可以放宽调用次数的限制。 ### 参数匹配 * 使用easymock的eq方法...

    easymock教程[归纳].pdf

    8. **创建Stub对象** - 通过Easymock,你可以为方法设定返回值或抛出异常,创建一个简单的Stub,用于满足特定的测试场景。 9. **放宽调用次数** - Easymock允许设定方法调用的最小和最大次数,这在处理不确定调用...

    easymock教程

    - **行为控制**:Stub对象的方法通常会有具体的实现逻辑,即使是非常简单的返回值或抛出异常。Mock对象的方法行为则是通过测试代码来控制的,例如设置预期的方法调用次数、参数等。 ##### 1.2 单元测试中的主要...

    java easymock

    8. **创建Stub对象**: 创建Stub可以设定一个方法总是返回相同的结果,无论何时被调用,这在你不需要验证调用,但需要控制返回值时非常有用。 9. **放宽调用次数**: 默认情况下,EasyMock期望的方法调用次数必须...

    单元测试资料

    2. **Mock和Stub的区别**:Mock对象会在测试后验证它被调用的方式,而Stub对象只返回预定义的值,不进行任何验证。 3. **测试DAO**:讲解如何使用Easymock模拟数据库操作,比如预设查询、插入、更新或删除的方法...

    新利用驱动程序和桩程序进行单元测试

    在Java中,可以使用Mockito、EasyMock等库来创建桩对象,使得测试更加可控和隔离。 单元测试的步骤通常包括: - **设置(Setup)**:在每个测试开始前,准备必要的测试环境,如初始化数据、创建对象等。 - **执行...

    books-powermock-unit-test

    即时模拟是指在运行时创建对象或模拟行为,这在测试某些复杂的依赖关系或无法正常构造的对象时非常有用。 "参考" 一词意味着这个压缩包可能包含了一些外部链接或者参考文档,这些文档可能提供了更深入的理论知识和...

    有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当...Mock说白了就是打桩(Stub)或则模拟,当你调用一个不好在测试中创建的对象时,Mock框架为你模拟一个和真实对象类似的替身来完成相应的行为。使用如下方式在Mav

    junit 学习资料

    9. **假对象(Mocks)与桩(Stubs)**:在单元测试中,有时需要模拟(mock)或替身(stub)外部依赖,JUnit 本身不提供这个功能,但可以结合使用 Mockito 或 EasyMock 这样的库来实现。 10. **测试驱动开发(TDD)*...

    建立测试引擎

    3. **Mocking和Stubbing**:在单元测试中,有时需要模拟(mock)或存根(stub)依赖对象的行为,以隔离测试。Java社区有Mockito、EasyMock和PowerMock等工具来实现这一目的。 4. **集成测试**:对于涉及数据库、...

    junitTesting

    7. **假对象和Mocking**:在JUnit测试中,经常需要模拟(mock)或桩(stub)其他依赖对象,以隔离被测试的代码。JUnit本身并不提供模拟功能,但可以与其他库如Mockito或EasyMock结合使用。 8. **测试驱动开发(TDD...

    java_test

    3. **Mocking和Stubbing**: 在复杂的系统中,有时需要模拟(mock)或存根(stub)依赖对象的行为,以隔离测试并专注于待测试代码的功能。Java社区有多个库可用于此目的,如Mockito和EasyMock。通过mocking,我们可以...

Global site tag (gtag.js) - Google Analytics