1.Mockito简介
Mockito是用于生产模拟对象的工具,其特点是对于某些不容易构造(如HttpServletRequest)或者不容易获取的复杂对象(如JDBC中的ResultSet),可用一个虚拟对象(Mock)来完成测试。Mockito最大的优点是可将单元测试的耦合分解开,即如果代码中对另一个类或者接口有依赖,Mockito可模拟这些依赖,并协助验证所调用的依赖行为。
2.引入依赖
新建一个SpringBoot工程,并在pom.xml文件中添加集成Mockito所需要的dependency。本小节列举Mockito的简单用法,更多高级用法请读者自行上官网学习。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
3.添加配置
在application.properties文件中添加如下配置信息。
############################################################
#
# MySQL配置
#
############################################################
### 连接信息
spring.datasource.url = jdbc:mysql://localhost:3306/mydb
### 用户名
spring.datasource.username = root
### 密码
spring.datasource.password = admin123
### 驱动
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
############################################################
#
# MyBatis配置
#
############################################################
### po类存放目录
mybatis.type-aliases-package = com.leichuangkj.mockito.dao.po
### mapper(.xml)资源文件存放路径
mybatis.mapper-locations = classpath:mybatis/mapper/*.xml
4.dao层开发
首先在项目目录“/src/main/java/com/leichuangkj/mockito”下新建“/dao/po”目录,并在po目录下新建User实体类,具体代码如下。
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private Integer id;
private String name;
private String email;
}
然后在dao目录下新建mapper目录,并在mapper目录下新建UserMapper接口,具体代码如下。
@Repository
public interface UserMapper {
User findByName(String id);
}
最后在resource目录下新建“mybatis/mapper”目录,并在mapper目录下新建UserMapper.xml文件,具体代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.leichuangkj.mockito.dao.mapper.UserMapper" >
<resultMap id="BaseResultMap" type="com.leichuangkj.mockito.dao.po.User">
<constructor>
<idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER" />
<arg column="name" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="email" javaType="java.lang.String" jdbcType="VARCHAR" />
</constructor>
</resultMap>
<select id="findByName" parameterType="java.lang.String" resultMap="BaseResultMap">
select id, name, email
from user
where name = #{name,jdbcType=VARCHAR}
</select>
</mapper>
4.service层开发
在项目目录“/src/main/java/com/leichuangkj/mockito”下新建service目录,并在service目录下新建IUser接口,具体代码如下。
public interface IUser {
ServerResponse findByName(String name);
}
然后在service目录下新建impl目录,并在impl目录下新建UserImpl实现类,具体代码如下。
@Service
public class UserImpl implements IUser {
@Autowired
UserMapper userMapper;
@Override
public ServerResponse findByName(String name) {
User user = userMapper.findByName(name);
if(user == null){
return ServerResponse.createByErrorMessage("没有查询到用户");
}
return ServerResponse.createBySuccess(user);
}
}
5.添加注解
在启动类MockitoApplication上添加注解“@MapperScan(basePackages = “com.leichuangkj.mockito.dao.mapper”)”,然后启动项目。
@MapperScan(basePackages = "com.leichuangkj.mockito.dao.mapper")
@SpringBootApplication
public class MockitoApplication {
public static void main(String[] args) {
SpringApplication.run(MockitoApplication.class, args);
}
}
6.测试
在单元测试类MockitoApplicationTests中添加如下代码。
@SpringBootTest
class MockitoApplicationTests {
@Test
void contextLoads() {
UserImpl userImpl = mock(UserImpl.class);
User user = new User(1,"steven","125****421@qq.com");
when(userImpl.findByName("steven")).thenReturn(user);
}
}
右键执行MockitoApplicationTests单元测试,这时可以看到控制台显示“1 test passed”以及如下打印信息。
7.工程目录结构