• 【JUnit】EasyMock用法总结


    使用EasyMock的总体步骤

    1、生成Mock接口

    1. IService mockService = EasyMock.createMock("name", IService.class);  

    如果要mock对象,而不是接口,应该使用class extension:org.easymock.classextension.EasyMock

    如果要mock多个接口,最好使用MockControl来管理:

    1. IMocksControl control = EasyMock.createControl();    
    2. IService1 mockObj1 = control.createMock(IService1.class);    
    3. IService2 mockObj2 = control.createMock(Iservice2.class);    

    2、设置预期行为

    如果返回值是void:

    1. mockService.doVoidMethod();  
    2. EasyMock.expectLastCall();// 最新版本的EasyMock可以忽略此句  


    如果要求抛出异常:

    1. EasyMock.expectLastCall().andThrow(  
    2.                 new MyException(new RuntimeException())).anyTimes();  


    如果返回值不是void:

    1. EasyMock.expect(mockService.doSomething(isA(Long.class), isA(Report.class),   
    2.         isNull(Report.class))).andReturn("return string").anyTimes();  

    上例方法中传入3个参数,分别是Long、Report、null——注意,如果参数是基本类型long,则使用EasyMock.anyLong()

    传入参数还可以定义为具体的对象,而不是类。

    3、将Mock对象切换到replay状态

    1. EasyMock.replay(mockService);  

    如果是用MockControl来管理:

    1. control.replay();    

    4、测试

    1. bo.setService(mockService);  
    2. bo.doSomething();  

    5、验证Mock对象的行为

    1. EasyMock.verify(mockService);   

    如果是用MockControl来管理:

    1. control.verify();  

    expect()注意事项

    期望传入参数为基本类型时

    用expect来设置mock方法的期望调用方式时,如果使用到基本类型,但是又不要基本类型的值,

    不能用:EasyMock.isA(Long.class)

    要用:EasyMock.anyLong()

    期望传入参数可能为null时

    如果传入的参数可能为null,如果用

    1. isA(String.class)  

    而实际传入的是null,则会报错 (isA(java.lang.String), <any>): expected: 1, actual: 0

    应该用:

    1. or(isA(String.class), isNull())  

    如果返回结果在运行时才能确定

    很可能某个方法期望的返回结果不是固定的,例如根据传入参数不同而不同;这时需要使用andAnswer():

    1. EasyMock.expect(mockService.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {  
    2.             public Integer answer() throws Throwable {  
    3.                 Integer count = (Integer) EasyMock.getCurrentArguments()[0];  
    4.                 return count * 2;  
    5.             }  
    6.         });  


    注意,通过EasyMock.getCurrentArguments()可以获取传入参数!

    times()

    常见问题

    java.lang.IllegalStateException: 2 matchers expected, 1 recorded.

    可能是设置mock方法的期望调用方式时,既使用了isA的方式来指定参数,又使用了一个具体值来作为参数

    比如这样写:

    1. expect(mockEmployeeRepository.findByDepartmentAndSpecification("HR",     
    2.        isA(EmployeeSearchSpecification.class)).andReturn(emplooyees);    


    正确的写法:——用eq(具体值)

      1. expect(mockEmployeeRepository.findByDepartmentAndSpecification(eq("HR"),    
      2.        isA(EmployeeSearchSpecification.class)).andReturn(employees);    
  • 相关阅读:
    C#实现Winform自定义半透明遮罩层
    C# winform 窗体弹出选择目录或文件 的对话框
    C# winform 窗体弹出选择目录或文件 的对话框
    python语言实现贪吃蛇
    python语言实现贪吃蛇
    用python写一个简单的表白代码
    用python写一个简单的表白代码
    用python写一个简单的表白代码
    百练2810:完美立方
    百练2810:完美立方
  • 原文地址:https://www.cnblogs.com/heidsoft/p/3832241.html
Copyright © 2020-2023  润新知