Junit Mock单元测试
添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- https://mvnrepository.com/search?q=Mockito-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
Mockito的API
mock:构建一个我们需要的对象;可以mock具体的对象,也可以mock接口
spy:构建监控对象
verify:验证某种行为
when:当执行什么操作的时候,一般配合thenXXX 一起使用。表示执行了一个操作之后产生什么效果
doReturn:返回什么结果
doThrow:抛出一个指定异常
doAnswer:做一个什么相应,需要我们自定义Answer
times:某个操作执行了多少次
atLeastOnce:某个操作至少执行一次
atLeast:某个操作至少执行指定次数
atMost:某个操作至多执行指定次数
atMostOnce:某个操作至多执行一次
doNothing:不做任何处理
doReturn:返回一个结果
doThrow:抛出一个指定异常
doAnswer:指定一个操作,传入Answer
doCallRealMethod:返回真实业务执行的结果,只能用于监控对象
ArgumentMatchers参数匹配
anyInt:任何int类型的参数,类似的还有anyLong/anyByte等等。
eq:等于某个值的时候,如果是对象类型的,则看toString方法
isA:匹配某种类型
matches:使用正则表达式进行匹配
OngoingStubbing返回操作
thenReturn:指定一个返回的值
thenThrow:抛出一个指定异常
then:指定一个操作,需要传入自定义Answer
thenCallRealMethod:返回真实业务执行的结果,只能用于监控对象
Stubbing
有返回的值的方法,模拟返回值
when(dictTypeDao.findById("1")).thenReturn(dictTypeOptional);
有返回的值的方法,模拟抛出异常
when(dictTypeDao.findById("1")).thenThrow(new RuntimeException());
无返回值void方法,模拟抛出异常
doThrow(new RuntimeException()).when(dictTypeDao).deleteById("1");
doNothing
doNothing().when(dictTypeRepository).deleteById("1");
匹配参数
上面的都是指定参数的,如果要匹配任意参数可以用anyString()、anyInt()、any(Class type)等等。
doThrow(new RuntimeException()).when(dictTypeRepository).deleteById(anyString());
Verify
when(mockedList.get(anyInt())).thenReturn("element");
System.out.println(mockedList.get(999));
System.out.println(mockedList.get(99));
verify(mockedList, times(1)).get(anyInt());
verify(mockedList).get(anyInt());//1次的也可以简写成这样
verify(mockedList, times(2)).get(anyInt());
verify(mockedList, atMost(2)).get(anyInt());
verify(mockedList, atLeast(2)).get(anyInt());
verify(mockedList, atLeastOnce()).get(anyInt());
verify(mockedList, never()).get(9);
package com.ruoyi.quartz.controller;
import cn.hutool.core.lang.Console;
import com.ruoyi.quartz.domain.SysJobLog;
import com.ruoyi.quartz.mapper.SysJobLogMapper;
import com.ruoyi.quartz.service.impl.SysJobLogServiceImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.test.context.junit4.SpringRunner;
import static org.mockito.Mockito.when;
@RunWith(SpringRunner.class)
class SysJobControllerTest {
@Mock
private SysJobLogMapper jobLogMapper;
@InjectMocks
private SysJobLogServiceImpl sysJobLogService;
@BeforeEach
public void init() {
// 对所有注解了@Mock的对象进行模拟
MockitoAnnotations.openMocks(this);
}
@Test
void job() {
SysJobLog sysJobLog = new SysJobLog();
sysJobLog.setJobLogId(1L);
sysJobLog.setJobName("job");
sysJobLog.setJobGroup("group");
sysJobLog.setInvokeTarget("target");
sysJobLog.setStartTime(new java.util.Date());
sysJobLog.setEndTime(new java.util.Date());
sysJobLog.setJobMessage("message");
sysJobLog.setStatus("status");
sysJobLog.setExceptionInfo("info");
sysJobLog.setRemark("remark");
//模拟saveUser方法,而调用getUserById为其真实实现
when( jobLogMapper.selectJobLogById(1L)).thenReturn(sysJobLog);
//真实行为
SysJobLog sysJobLog1 = jobLogMapper.selectJobLogById(1L);
//模拟行为
Console.log(sysJobLog1);
}
}