使用Mock对接口(controller层)进行单元测试
来源:互联网 发布:乳胶床垫 知乎 编辑:程序博客网 时间:2024/06/07 04:45
在近些天单元测试的过程中,遇到了各种需要使用Mock的情况,现总结记录。
测试背景如下(虚构):
QueryInfoController.java文件提供查询数据的接口;
QueryService.java调用Dao层查询数据;
QueryInfoControllerTest.java对QueryInfoController.java进行单元测试;
现分情况对Mock进行说明:
1、对带返回值的service方法进行Mock
QueryService queryService = PowerMockito.mock(QueryService.class);ReflectionTestUtils.setFiled(queryInfoController, "queryService ", queryService );PowerMockito.when(queryService.queryInfo(Mockito.anyMap())).thenReturn(youList);
在测试环境下,我们不一定需要真正去查询数据库或者说也没有必要查询数据库。因为在对controller层进行单元测试之前,对Dao层和Service层的测试应该是通过了的。所以这时可以省略service操作,用Mock代替。在本例中,先对QueryService进行Mock,然后设定其有效区域,即“queryInfoController”。所以在这之前,我们需要
@Autowiredprivate QueryInfoController queryInfoController;最后让queryInfo方法按照你的想法输出。
注:Mockito.anyMap()可按照需求替换成anyString()等;
youList为你期待的返回(自己赋值)
2、对不带返回值的service方法进行Mock
QueryService queryService = EasyMock.createMock(QueryService.class);queryService.valiteInfo(EasyMock.anyMap());EasyMock.expectLastCall();ReflectionTestUtils.setFiled(queryInfoController, "queryService ", queryService );EasyMock.replay(queryService);什么情况下需要对无返回值的方法进行Mock呢?比如Controller中需要对请求报文进行参数校验,假设QueryService.validateInfo()方法进行校验,如果校验失败则直接抛出异常;如果校验成功则doNothing。在测试情况下,我们没有必要写一个正确的测试用例去满足这个校验,使用Mock可以忽略这个函数。
3、对静态方法进行Mock
PowerMock.mockStatic(ValidateUtils.class); EasyMock.expect(ValidateUtils.someMethod()).andReturn(youList); PowerMock.replayAll(); PowerMock.verifyAll();
4、对无返回值的静态方法进行Mock
PowerMockito.mockStatic(ValidateUtils.class); PowerMockito.doNothing().when(ValidateUtils.class);我们换个场景,如果这时对请求报文的校验不交给service去做,而是交给一个专门的工具类去处理,那么这时就需要对工具类中的静态方法进行Mock。但是,本例中的代码会存在一个问题:它会把工具类中的所有方法进行Mock。接下来看看例4
5、对工具类中部分函数进行Mock
PowerMockito.mockStatic(ValidateUtils.class); PowerMockito.when(ValidateUtils.someMethod(Mockito.anyMap())).thenCallRealMethod();PowerMockito.doNothing().when(ValidateUtils.class);
而在某些情况下,我们又需要某个静态方法真正被执行,这时加上第二行代码即可。
注:如果运行过程中出错,查看是否缺少下面的内容
1、声明
@Rulepublic PowerMockRule rule = new PowerMockRule();
2、静态方法需要在类之前写入
@PrepareForTest({ QueryInfoController.class, ValidateUtils.class })
1 0
- 使用Mock对接口(controller层)进行单元测试
- 使用Mock 对spring mvc 的controller层进行单元测试
- 利用Spring的mock对控制层进行单元测试
- 使用mock进行单元测试
- 使用MOCK对象进行单元测试
- 使用 MOCK 对象进行单元测试
- 使用MOCK对象进行单元测试
- 使用mock进行java单元测试
- mock controller 单元测试
- 使用Mock MVC来进行Controller 层的junit的测试
- 使用spring-mock进行dao单元测试
- 使用 Python Mock 类进行单元测试
- 使用 Python Mock 类进行单元测试
- 使用JUnit4对SSH2框架Service/Dao层进行单元测试
- Junit对Spring Controller进行单元测试
- 使用mockserver来进行http接口mock
- Controller 使用RestTemplate进行单元测试 spring mvc
- 今天使用了spring-mock来进行单元测试
- JavaScript中call、apply、bind函数的用法
- word中图片较多时用的小技巧
- HTC Vive开发笔记之手柄震动 转
- 使用WITH AS提高性能简化嵌套SQL
- Android轻量缓存框架ASimpleCache
- 使用Mock对接口(controller层)进行单元测试
- php serialize序列化使用 和json效率对比
- C/C++系列——函数声明全解析
- Android6.0 PackageManagerService卸载应用
- 8266开发过程
- eclipse中ctrl+alt+方向键快捷键和显卡快捷键冲突解决办法
- 线性表应用举例
- MFC 播放动画。
- Android的零散知识