1.什么是Mock
mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为。
2.常用注解
@InjectMocks | 创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。 |
@Mock | 使用@Mock生成的类,所有方法都不是真实的方法,而且返回值都是NULL |
@Spy | 使用@Spy生成的类,所有方法都是真实方法,返回值都是和真实方法一样的 |
@BeforeEach | 测试前的准备 |
@AfterEach | 测试结束 |
3.常用方法
When().thenReturn() | 当这个对象为多少时,赋值多少 |
When().thenThrow() | 模拟异常(方法返回类型为void) |
When().thenCallRealMethod() | 调用mock对象的真实方法 |
Vertify() | 验证执行次数 |
AssertEquals() | 验证实际值和期望值的比较 |
4.使用手册
在SpringBoot项目中使用教程
4.1导入依赖
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
</dependency>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
</dependencies>
4.2目标类
package com.bck.myexample.service.impl;/*
*@program:MyExample
*@author: bck
*@Time: 2022/6/3 10:37
*@description: 用户service
*/
import com.bck.myexample.entity.User;
import com.bck.myexample.mapper.UserMapper;
import com.bck.myexample.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
/**
* 添加或者修改用户信息
* @param user
* @return
*/
@Override
public int addOrModUser(User user) {
int insert=0;
if(user.getId()!=null){
insert=userMapper.updateById(user);
}else {
insert=userMapper.insert(user);
}
return insert;
}
}
4.3测试类
package com.bck.myexample.service.impl;/*
*@program:MyExample
*@author: bck
*@Time: 2022/6/3 10:45
*@description: 用户测试类
*/
import com.bck.myexample.entity.User;
import com.bck.myexample.mapper.UserMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.test.context.junit4.SpringRunner;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@RunWith(SpringRunner.class)
public class UserTest {
@InjectMocks
private UserServiceImpl userService;
@Mock
private UserMapper userMapper;
/**
* 测试添加用户
*/
@Test
public void testAddOrModUser1(){
User user=User.builder()
.username("bck")
.password("180405")
.build();
when(userMapper.insert(any())).thenReturn(1);
int insert = userService.addOrModUser(user);
Assert.assertEquals(1, insert);
}
/**
* 测试修改用户
*/
@Test
public void testAddOrModUser2(){
User user=User.builder()
.id(1)
.username("bck")
.password("180405")
.build();
when(userMapper.updateById(any())).thenReturn(1);
int insert = userService.addOrModUser(user);
Assert.assertEquals(1, insert);
}
}
4.4测试结果
成功
失败
4.5代码覆盖率
- 绿色代表这行代码我们测试的时候覆盖到
- 红色代码这行代码我们测试的时候没有覆盖到