`
zl198751
  • 浏览: 278440 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

EasyMock教程-运行时返回值或者异常 文章分类:软件开发管理

阅读更多

easymock教程-运行时返回值或者异常

来至:http://skydream.iteye.com/blog/834158

 

 

        前面的教程中,我们看到easymock可以通过expect方法来设定mock方法的返回值或者异常,但是注意这些案例中设置的返回值都是在调用被测试 的类的方法前就已经确定下来的,即我们其实在测试类的代码运行前(实际是在EasyMock.replay()方法调用前)就已经"预知"了返回结果。

 

    但是在某些情况下,我们可能无法预知返回值,比如我们需要根据输入的参数值来决定返回什么,而这个参数可能无法在record阶段获得。因此在mock方法中我们无法在record阶段就决定应该返回什么。

 

    对于这种场景,easymock提供了IAnswer接口和andAnswer()方法来提供运行时决定返回值或者异常的机制。

 

    我们来看一个简单的例子:

     public   class  Business  {
        
private  Service service;

        
public   void  execute()  {
            
int  count  =  ramdonInt();
            
int  result  =  service.execute(count);
        }


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


        
private   int  ramdonInt()  {
            Random random 
=   new  Random();
            
return  random.nextInt()  /   10000 ;
        }

    }


    
public   interface  Service  {
        
public   int  execute( int  count);
    }

    在Business的execute()方法中,需要调用service.execute(int count)方法,而传入的参数count是需要运行时才能确定的,这里为了简单我们random了一个int来模拟这种情况。

 

    然后看测试案例

    @Test
    
public   void  testRuntimeReturn()  {
        Business business 
=   new  Business();
        Service service 
=  EasyMock.createMock(Service. class );
        business.setService(service);
        EasyMock.expect(service.execute(EasyMock.anyInt())).andAnswer(
new  IAnswer < Integer > ()  {
            
public  Integer answer()  throws  Throwable  {
                Integer count 
=  (Integer) EasyMock.getCurrentArguments()[ 0 ];
                
return  count  *   2 ;
            }

        }
);

        EasyMock.replay(service);
        business.execute();
        EasyMock.verify(service);
    }

    这里我们通过EasyMock.expect(service.execute(EasyMock.anyInt()))来接受任意值的count参数输 入,andAnswer(new IAnswer<Integer>() {}) 让我们可以指定一个IAnswer的实现类来给出返回值。在这个IAnswer的实现类中,我们通过 EasyMock.getCurrentArguments()[0]获取到service.execute()方法的第一个参数,然后简单的运用 count*2规则给出返回值。这里的EasyMock.getCurrentArguments()方法可以获取到运行时的参数列表,不过注意这个方法 对重构不够友好,如果参数列表发生变化则必须手工修改对象的获取参数的代码。

 

    下面是一个运行时抛出异常的例子,简单起见我们通过设置exception的message来在错误信息中传递运行时的count值。

   @Test
    
public   void  testRuntimeException()  {
        Business business 
=   new  Business();
        Service service 
=  EasyMock.createMock(Service. class );
        business.setService(service);
        EasyMock.expect(service.execute(EasyMock.anyInt())).andAnswer(
new  IAnswer < Integer > ()  {
            
public  Integer answer()  throws  Throwable  {
                Integer count 
=  (Integer) EasyMock.getCurrentArguments()[ 0 ];
                
throw   new  RuntimeException( " count= "   +  count);
            }

        }
);

        EasyMock.replay(service);
        
try   {
            business.execute();
            fail(
" should throw RuntimeException " );
        }
  catch  (RuntimeException e)  {
            assertTrue(e.getMessage().indexOf(
" count= " !=   - 1 );
            
// get count from message
            EasyMock.verify(service);
        }

    }

    除了IAnswer接口外,easymock中还有另外一个方式可以完成类似的功能,就是使用andDelegate()方法,

     public   class  ServiceStub  implements  Service  {
        
public   int  execute( int  count)  {
            
return  count  *   2 ;
        }

    }


    @Test
    
public   void  testRuntimeReturn()  {
        Business business 
=   new  Business();
        Service service 
=  EasyMock.createMock(Service. class );
        business.setService(service);
        EasyMock.expect(service.execute(EasyMock.anyInt())).andDelegateTo(
new  ServiceStub());

        EasyMock.replay(service);
        business.execute();
        EasyMock.verify(service);
    }

    这里需要先创建一个Service类的实现类和一个实例,然后通过andDelegateTo()将这个stub的实例传进去,注意这里delegate进去的实例必须是mock对象接口相同。

 

    delegateTo方式实际上是我们手工创建了stub(mock和stub的概念及差别请参考本教程的"mock和stub"一文),这和我们使用 easymock的初衷有所违背。而且当这个接口有众多方法时,创建这样一个stub会显得很痛苦,不如使用IAnswer方便直接。

分享到:
评论

相关推荐

    easymock详解教程

    #### 1.13 easymock教程-运行时返回值或者异常 在某些情况下,可能希望根据不同的条件返回不同的值或抛出不同的异常。easymock支持运行时动态改变返回值或异常。 - **定义返回值**:使用`andReturn`方法来定义方法...

    easymock教程

    ##### 1.13 运行时返回值或者异常 - **动态设定返回值**:在测试过程中,可以根据不同的条件设定不同的返回值。 - **模拟异常**:也可以设置某些方法调用时抛出异常。 ##### 1.14 改变同一个方法调用的行为 - **...

    powermock-easymock-junit-1.6.1.zip

    在"powermock-easymock-junit-1.6.1.zip"这个压缩包中,包含了这些工具的特定版本。 首先,我们来了解一下EasyMock。EasyMock是一个模拟框架,它允许开发者创建预期的交互(mock objects)并验证对象之间如何进行...

    powermock-easymock-junit-1.5.4.zip

    这个压缩包"powermock-easymock-junit-1.5.4.zip"很可能包含了这三个库的特定版本1.5.4,便于开发者下载和集成到自己的项目中。 首先,我们来详细了解一下PowerMock。PowerMock是一个扩展了其他模拟框架(如...

    easymock教程.zip

    这个“easymock教程.zip”包含了帮助你深入理解和使用Easymock的资源,特别是其中的“easymock教程.pdf”。下面将详细阐述Easymock的核心概念、功能以及如何使用它进行单元测试。 1. **什么是Easymock**: ...

    easymock2-javadoc-2.5.2-12.el7.noarch.rpm

    离线安装包,亲测可用

    easymock2-2.5.2-12.el7.noarch.rpm

    离线安装包,亲测可用

    easymock教程.pdf

    ### 运行时返回值或者异常 * 使用easymock的andReturn方法可以指定返回值。 * 使用easymock的andThrow方法可以指定抛出异常。 ### 改变同一个方法调用的行为 * 使用easymock的andThen方法可以改变同一个方法调用...

    easymock-4.0-bundle

    手动的构造 Mock 对象会给开发人员带来额外的编码量,而且这些为创建 Mock 对象而编写的代码很有可能引入错误。目前,有许多开源项目对动态构建 Mock 对象提供了支持,这些项目能够根据现有的接口或类动态生成,这样...

    easymock-2.5.2.jar

    easymock-2.5.2.jar easymock-2.5.2.jar 单元测试

    easymock-3.1.jar

    easymock需要用到的包,没有它不行,easymock-3.1.jar

    easymock-3.2.jar

    EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。

    easyMock

    EasyMock支持动态mocking,这意味着可以在运行时改变模拟对象的行为。这在测试中非常有用,因为可以根据测试需求灵活地调整模拟对象的响应。 **4. 高级特性** - **回调**:使用`doAnswer()`方法,可以指定当方法被...

    4-EasyMock-Servlet.rar

    在“4-EasyMock-Servlet.rar”这个压缩包中,我们很可能是得到了一个关于如何使用EasyMock进行Servlet测试的教程或者示例代码。让我们详细探讨一下EasyMock与Servlet结合使用的相关知识点。 1. **EasyMock基本概念*...

    easymock-2.5.2工具 下载

    EasyMock的工作原理是,它允许开发者指定模拟对象的行为,例如方法调用的返回值、异常或者回调。在测试过程中,这些模拟对象会代替真实的依赖,从而使得测试更加可控。例如,你可以设置一个模拟数据库连接,在特定的...

    EasyMock 3.1相关jar(所有)

    还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...

    easymock-3.1

    6. **Mock Object 的生命周期管理**:EasyMock 3.1提供了`createMock`和`createNiceMock`方法来创建模拟对象,而`reset`和`replay`方法用于重置和开始新的期望录制。 7. **Mockito集成**:EasyMock 3.1还支持与另一...

    easymock-3.2.zip

    1. **API文档**:这是EasyMock的接口文档,详细描述了各个类和方法的使用方法、参数和返回值,是开发者理解和学习EasyMock的关键资料。通过阅读API文档,你可以了解如何创建模拟对象,设置期望值以及验证行为。 2. ...

    easymock教程[归纳].pdf

    本教程详细介绍了Easymock的各种特性和使用方法,旨在帮助软件开发人员掌握这一工具。 1. **Mock和Stub的概念** - Mock对象是用于代替真实对象的虚拟对象,它在测试中按照预设的规则来响应调用,帮助验证方法是否...

    easyMock.zip

    这个“easyMock.zip”文件包含了一个关于EasyMock使用的教程,特别是它的典型应用,对于理解和掌握EasyMock在实际开发中的应用非常有帮助。 首先,EasyMock的基本概念是模拟对象。在单元测试中,我们通常需要测试一...

Global site tag (gtag.js) - Google Analytics