junit mock 方法(need的用法总结)

使用EasyMock的总体步骤1、生成Mock接口IServicemockService=EasyMock.createMock(“name”,IService.class);如果要mock对象,而不是接口,应该使用classextension:org.easymock.classextension.EasyMock如果要mock多个接口,最好使用Mo

大家好,又见面了,我是你们的朋友全栈君。

使用EasyMock的总体步骤

1、生成Mock接口

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

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

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

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

2、设置预期行为

如果返回值是void:

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


如果要求抛出异常:

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


如果返回值不是void:

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

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

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

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

EasyMock.replay(mockService);

如果是用MockControl来管理:

control.replay();  

4、测试

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

5、验证Mock对象的行为

EasyMock.verify(mockService); 

如果是用MockControl来管理:

control.verify();

expect()注意事项

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

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

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

要用:EasyMock.anyLong()

期望传入参数可能为null时

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

isA(String.class)

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

应该用:

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

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

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

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


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

times()

常见问题

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

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

比如这样写:

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

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

    expect(mockEmployeeRepository.findByDepartmentAndSpecification(eq("HR"),  
           isA(EmployeeSearchSpecification.class)).andReturn(employees);  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128679.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Macromedia flash制作落叶飘下动画

    Macromedia flash制作落叶飘下动画flash制作落叶动画打开MacromediaFlash软件,新建一个flash文档将所需所有素材导入到库中设置背景并将拖入到舞台的图片转换为图片元件设置落叶图层为图层2添加引导层,自定义枫叶下落路线轨迹。打开MacromediaFlash软件,新建一个flash文档将所需所有素材导入到库中使用“文件-导入-导入到库”命令将所有素材导入到库中。导入结果如下图设置背景并将拖入到舞台的图片转换为图片元件将库中的图片拖入到舞台中间,自动创建图层1,选中左侧工具栏中的“任意变形工具”,拖动过

    2022年5月2日
    52
  • linux的stat命令_fstat函数

    linux的stat命令_fstat函数#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>intstat(constchar*pathname,structstat*buf);pathname:用于指定一个需要查看属性的文件路径。buf:structstat类型指针,用于指向一个structstat结构体变量。调用stat函数的时候需要传入一个structstat变量的指针,获取到的文件..

    2022年8月21日
    6
  • IIS7 出现HTTP 500内部服务器错误解决方案[通俗易懂]

    IIS7 出现HTTP 500内部服务器错误解决方案[通俗易懂]2019独角兽企业重金招聘Python工程师标准>>>…

    2022年8月12日
    5
  • 电脑鼠标能动但点什么都没反应_联想台式机鼠标键盘没反应

    电脑鼠标能动但点什么都没反应_联想台式机鼠标键盘没反应1.联想电脑鼠标盘没反应是怎么回事1.打开笔记本电脑,没有任何提示,但触摸板触摸完全没有反应。这时候要确保触摸屏不是锁上了,触摸屏锁上了就会完全没有反应,这个解决办法很简单,笔记本一般按住Fn(功能键)+F6(不同的笔记本不同的按键,按键上有触摸板图像)即可解锁。有些笔记本有独立的触摸屏开锁键,注意看看哪个键有个小键盘在上面的即可。2.软件问题主要说的是驱动出现问题,例如刚刚重新安装过电脑…

    2022年9月14日
    2
  • Python学习路线(课程大纲+Python视频教程+下载地址)

    最新Python学习路线+千锋Python课程大纲+Python视频教程+Python学习资料下载地址大合集目前Python已经成为最受欢迎的程序设计语言之一。Python的设计哲学是“优雅”、“明确”、“简单”。Python的优点(来自百科)简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白…

    2022年4月18日
    42
  • 机器学习常见问题

    机器学习常见问题

    2021年11月19日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号