Java的Mockito测试如何使用

由于种种原因,我们暂时无法从数据库、或者依赖其他系统的接口中,无法获取到测试数据,我们难以对自己的接口顺利进行测试,所以我们可以使用Mockito测试框架来Mock所需要的数据,测试我们的代码。

简单方法使用(无其他系统依赖情况)

1.测试方法是否被调用

     @Testpublic void verifyAccount(){Account mockAccount = mock(Account.class);mockAccount.setAge(1);mockAccount.setName("单边里");//verify方法来确认方法是否调用了setAge(),setName()方法verify(mockAccount).setAge(1);verify(mockAccount).setName("单边里");}

2.Mock测试返回值

 @Testpublic void returnTest(){Account mockAccount = mock(Account.class);//当调用getId()方法的时候,thenReturn方法mock自定义返回值when(mockAccount.getId()).thenReturn(2L);//当调用getId()方法的时候,thenThrow方法mock抛出自定义异常when(mockAccount.getName()).thenThrow(new NoSuchElementException());System.out.println(mockAccount.getId());System.out.println("-------");System.out.println(mockAccount.getName());}结果:
2
-------java.util.NoSuchElementExceptionat com.test.AccountTest.returnTest(AccountTest.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)...

3.验证参数

账户类中添加一个简单生成密码的方法:入参为Long类型

public String setPasswordById(Long id){this.password=this.id+this.name+id;return this.password;}

Mock测试参数:

 @Testpublic void matchTest(){Account mockAccount = mock(Account.class);//anyLong()方法测试入参是否是所需要类型when(mockAccount.setPasswordById(anyLong())).thenReturn("单边里新密码");System.out.println(mockAccount.setPasswordById(10L));}结果:单边里新密码

4.验证方法调用次数和顺序

     @Testpublic void orderTest(){Account mockAccount = mock(Account.class);mockAccount.setName("唐寅");mockAccount.setName("赵越");mockAccount.setName("白均可");//times方法验证次数verify(mockAccount,times(3)).setName(anyString());//inOrder验证执行顺序,参数可传入多个对象InOrder inOrder = inOrder(mockAccount);inOrder.verify(mockAccount).setName("唐寅");inOrder.verify(mockAccount).setName("赵越");inOrder.verify(mockAccount).setName("白均可");}

5.监控真实对象、装扮其方法

 @Testpublic void spyTest(){//创建真实对象Account account = new Account(1L,"唐寅");//监控此对象Account spy = spy(account);//装扮getName方法when(spy.getName()).thenReturn("田家豪");System.out.println(spy.getId());System.out.println(spy.getName());}
//结果:
1
田家豪

分布式环境使用(有其他系统依赖情况)

如微服务架构下,多服务直接需要交互,如果依赖对方的代码还未开发完成,我们便可以Mock他们的接口来使用。如需要依赖对方的用户系统,根据id查询User对象,获取name,来set到我们的Account对象中:

所依赖的系统:

模型类:

//其他系统内容
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {private int id;private String name;
}
//其他系统中的接口,模拟还未完成,返回null
@Service
public class UserServiceImpl implements UserService {@Overridepublic User findUserById(int id) {return null;}
}

本系统:

模型类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Account {private int id;private String name;//name数据需要依赖用户系统查询private String address;
}

接口:

@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate UserService userService;@Overridepublic Account findAccountById(int id) {return new Account(id,userService.findUserById(id).getName(),"李家亚");}
}

Mock单元测试

@RunWith(MockitoJUnitRunner.class)
public class MockTest {@InjectMocksprivate AccountService accountService = new AccountServiceImpl();//自身接口@Mockprivate UserService userService;//依赖其他还未完成的接口@Testpublic void method(){//因为对方还未完成接口,所以我们假设调用其接口会返回user,是自定义的User user = new User(2,"唐寅");Mockito.when(userService.findUserById(Mockito.anyInt())).thenReturn(user);//我们断言一下期望name是否和实际本系统方法返回对象中的name相同Assert.assertEquals("唐寅",accountService.findAccountById(2).getName());}
}
//结果,绿色通过

Java的Mock测试到底怎么使用相关推荐

  1. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  2. java junit mock_使用Mockito进行Java的Mock测试

    测试替身 dummy用于传递,不会真正使用,例如用于填充的方法的参数列表. Fake有简单实现,但通常被简化,比如在内存数据库,而不是真正的数据库中使用. Stub是接口或类中部分实现,测试时使用其实 ...

  3. Java单元测试之模拟利器-使用PowerMock进行Mock测试

    首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...

  4. java的单元测试-mock测试

    文章目录 简介 Assert mockMVC 优化 mockBean(模拟bean和测试接口) 简介 对于普通的方法,通常采用断言测试. 对于接口,需要使用mockMvc 对于未开发的功能,需要moc ...

  5. JAVA测试类注解以及Mock测试

    我们在项目中,经常要编写一个测试类XXXXXTest,其中一般会用到以下注解: 一.常用注解 1. @RunWith(PowerMockRunner.class) JUnit将会调用@RunWith中 ...

  6. java unit test moke_惊了,unittest做接口mock测试竟然这么简单

    在项目研发的时候,一般开发会先提供接口文档,虽然很多接口并没有被实现,但测试可以提前写好Mock,等接口实现时可以快速完成该接口的自动话代码编写,进而提高接口自动化测试效率,那么使用Python如何实 ...

  7. 我们用到的3种Mock测试方案​

    Mock  这个词对于测试人员来说并不陌生,当我们要测试的接口 A 依赖接口 B ,可 B 无法满足我们的测试需求时,需要 Mock 一下接口 B,来测试 A.当前端和服务端并行开发时,如果服务端接口 ...

  8. java流行的测试框架调研+市面上书籍调研

    主要是根据51job的右侧来判断 java测试框架名称 51job职位数量 百度词条数量 JUnit 732 48,500,000 REST Assured 3 19,500,000 Selenium ...

  9. 使用junit+mockito进行mock测试实例

    刚开始做网站的时候,测试都是这样的(比如测试修改用户信息的表单逻辑):设置断点,启动运行程序,登陆,点击点击点击然后进入到测试的页面,输入测试数据,进入断点--..一个大的程序启动又慢,还要登陆,还要 ...

最新文章

  1. 杭电2028--Lowest Common Multiple Plus
  2. linux printf 刷新,linux下printf中\n刷新缓冲区的疑问(已解决)
  3. uni-app中使用lodash_uniapp适配到微信小程序注意事项
  4. JavaScript与Java的关系(联系与区别)
  5. esplise自定义快捷代码补全_【Eclipse】_Eclipse自动补全增强方法 常用快捷键
  6. 常见问题_自动打螺丝机常见问题及解决办法
  7. 小马智行完成D轮融资首次交割 估值达85亿美元
  8. Oracle GoldenGate Director安装和配置(无图)
  9. 21天jmeter打卡day2-环境搭建
  10. SEO行业应该如何给客户报价
  11. python 简单 socket 编程
  12. Autodesk 首届中国开发者训练营将开始报名,5月24日前报名6折优惠!
  13. RoboWare Studio入门教程(一)
  14. 升级win10系统后出现语言乱码怎么办,如何解决乱码问题?
  15. 打印机接无线共享服务器出现乱码,Ricoh理光复印机网络打印机出乱码的解决办法...
  16. HTML网页设计作业个性潮流服装商城模板
  17. mysql脚本修改大量数据问题
  18. forensics - make virtual machine with E01[ewf] files on OSX ———— 电子取证 MAC OS平台仿真
  19. 微信小程序开发: 开发前准备工作
  20. PHP信息PHPINFO

热门文章

  1. [golang爬虫实战]到sohu上爬取搞笑gif图片
  2. InSAR有什么前景
  3. Opencv2.4学习::二值化(1)OTSU算法
  4. java swing 登陆界面+跳转界面
  5. AGRCZO-A-10/315先导比例减压阀放大器
  6. 难得一见的机械原理动态图
  7. 安装Fedora系统和一些系统配置
  8. Mysql主键索引,普通索引索引,唯一索引的区别
  9. Java面试题之:线程池原理
  10. 微软本周发布WP8:目前所知新功能和新手机