package com.surpass.service;
import com.surpass.entity.TeacherEntity;
import com.surpass.entity.UserEntity;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.stubbing.Answer;
import java.util.List;
import java.util.Set;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
/**
* 参数匹配:通过方法签名(参数)来指定哪些方法调用时需要被处理(插桩、verify验证)
* 注意:在只用匹配器是要么都用要么都不用,禁止混搭!!举例
* 正确:getUserListByTeacher("name", "address")或者getUserListByTeacher(anyString(), anyString())
* 错误:getUserListByTeacher(anyString(), "address")
*/
@ExtendWith(MockitoExtension.class)
public class ParamMatcherTest {
@Mock
private TeacherService teacherService;
/**
* 对于mock对象不会调用真实方法,直接返回mock对象的默认值
* 默认值(int)、null、空集合
*/
@Test
public void test1(){
TeacherEntity teacher = teacherService.getTeacherByName("");
System.out.println("teacher = " + teacher);
Set<UserEntity> userListByTeacherName = teacherService.getUserListByTeacherName("");
System.out.println("userListByTeacherName = " + userListByTeacherName);
}
/**
* 方法插桩时的参数匹配
* 参数匹配时类(ArgumentMatchers)是匹配参数的主要成员,例如:
* any()则表示某一个方法传入任何类型都符合要求
* anyString()则表示字符串类型都符合要求
* !!!注意:所有的匹配都不包括null值
*/
@Test
public void test2(){
TeacherEntity teacherEntity = new TeacherEntity();
teacherEntity.setName("张三");
teacherEntity.setAddress("北京");
//when(teacherService.getTeacherByName("")).thenReturn(teacherEntity); 此行插桩方式也可
doReturn(teacherEntity).when(teacherService).getTeacherByName(any());
TeacherEntity teacher = teacherService.getTeacherByName("123");
System.out.println("teacher = " + teacher);
//验证校验teacherService.getTeacherByName()调用的次数,之前调了一次所以校验通过,如两次则抛异常
verify(teacherService, times(2)).getTeacherByName(any());
}
@Mock
private List<String> mockList;
/**
* 被插桩的方法在调用时不会执行实际的逻辑,直接返回指定的返回值
*/
@Test
public void test3(){
/**
* 指定返回值
*/
//方法插桩:当调用mockList.get(0)时返回指定返回值“zero”
doReturn("zero").when(mockList).get(0);
Assertions.assertEquals("zero", mockList.get(0));
when(mockList.get(1)).thenReturn("one");
Assertions.assertEquals("one", mockList.get(1));
/**
* void返回值方法插桩
*/
doNothing().when(mockList).clear();
mockList.clear();
verify(mockList, times(1)).clear();
/**
* 抛异常
*/
doThrow(RuntimeException.class).when(mockList).clear();
try {
mockList.clear();
//断言证明插桩失败
Assertions.fail();
} catch (Exception e) {
Assertions.assertTrue(e instanceof RuntimeException);
}
//或
when(mockList.get(anyInt())).thenThrow(RuntimeException.class);
try {
mockList.get(4);
//断言证明插桩失败
Assertions.fail();
} catch (Exception e) {
Assertions.assertTrue(e instanceof RuntimeException);
}
/**
* 多次插桩
* 意为第一次调用返回1,第二次调用返回2,第三次以及以后调用返回3
*/
when(mockList.size()).thenReturn(1).thenReturn(2).thenReturn(3);
//或-----两者相同
when(mockList.size()).thenReturn(1, 2, 3);
Assertions.assertEquals(1, mockList.size());
Assertions.assertEquals(2, mockList.size());
Assertions.assertEquals(3, mockList.size());
Assertions.assertEquals(3, mockList.size());
}
/**
* thenAnswer来实现对指定逻辑的插桩
*/
@Test
public void test4() {
when(mockList.get(anyInt())).thenAnswer((Answer<String>) invocation -> {
//getArgument表示获取插桩方法(此处为mockList.get(anyInt()))的第几个参数值
Integer argument = invocation.getArgument(0, Integer.class);
return String.valueOf(argument * 100);
});
//执行get方法
System.out.println(mockList.get(1));
}
/**
* 调用真实逻辑
*/
@Test
public void test5() {
when(teacherService.getTeacher(any())).thenCallRealMethod();
System.out.println(teacherService.getTeacher("123"));
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Mockito+junit5搞定单元测试
共39个文件
java:14个
class:13个
xml:9个
0 下载量 78 浏览量
2024-01-04
22:56:30
上传
评论
收藏 37KB ZIP 举报
温馨提示
Mockito+junit5搞定单元测试
资源推荐
资源详情
资源评论
收起资源包目录
Mockito_Demo.zip (39个子文件)
Mockito_Demo
HELP.md 430B
pom.xml 3KB
src
test
java
com
surpass
service
AssertTest.java 256B
ParamMatcherTest.java 5KB
TeacherServiceTestMethod1.java 724B
InjectMocksTest.java 1KB
TeacherServiceTestMethod3.java 709B
TeacherServiceTestMethod2.java 817B
mockito_demo
MockitoDemoApplicationTests.java 230B
main
java
com
surpass
MockitoDemoApplication.java 326B
dao
UserDao.java 265B
TeacherDao.java 277B
service
UserService.java 2KB
TeacherService.java 2KB
entity
UserEntity.java 797B
TeacherEntity.java 802B
.idea
jarRepositories.xml 2KB
codeStyles
codeStyleConfig.xml 153B
Project.xml 269B
uiDesigner.xml 9KB
workspace.xml 10KB
misc.xml 513B
compiler.xml 635B
.gitignore 184B
encodings.xml 345B
target
classes
com
surpass
MockitoDemoApplication.class 714B
dao
UserDao.class 274B
TeacherDao.class 286B
service
UserService.class 2KB
TeacherService.class 3KB
entity
UserEntity.class 3KB
TeacherEntity.class 3KB
test-classes
com
surpass
service
TeacherServiceTestMethod2.class 1KB
TeacherServiceTestMethod1.class 1KB
ParamMatcherTest.class 5KB
InjectMocksTest.class 970B
TeacherServiceTestMethod3.class 1KB
mockito_demo
MockitoDemoApplicationTests.class 568B
generated-test-sources
test-annotations
generated-sources
annotations
.gitignore 395B
共 39 条
- 1
资源评论
听风听雨听世界
- 粉丝: 89
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- XILINXFPGA源码Xilinxspratan3xcs100E(VGAPS2)
- XILINXFPGA源码XilinxSPARTAN-3E入门开发板实例
- XILINXFPGA源码XilinxSdramVerilog和VHDL版本文档
- 物联网智能家居方案-基于Nucleo-STM32L073&机智云(大赛作品,文档齐全,可直接运行)(文档加Matlab源码)
- XILINXFPGA源码XilinxISE9.xFPGACPLD设计源码
- 成都市地图含高新区(高新南区,高新西区),天府新区,东部新区虚拟行政区划
- XILINXFPGA源码XilinxEDK设计试验
- XILINXFPGA源码XilinxEDKMicroBlaze内置USB固件程序
- 基于 django 的视频点播后台管理系统源代码+数据库
- 基于Java的网上医院预约挂号系统的设计与实现(部署视频)-kaic.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功