单元测试Mockito写法介绍
2020-06-08 本文已影响0人
cmeizu
- 之前因为在做项目开发的时候,做单元测试用容器启动,现在所在的公司用的是Mockito这个工具来模拟,做单元测试,所心记录一下学到的知识。
Mockito个人理解
简单的来说就是不去关注数据库调出来的数据,数据库层的数据由自己来指定,去检测自己写的业务代码,数据方面不出错的情况下,业务代码是否是正确的。
-
下面举一下例子来说明一下。
-
sevice的代码
package cn.cmeizu.junit.service;
import cn.cmeizu.junit.entity.User;
import java.util.List;
/**
* @author 思念是一种痛
* @date 2020/6/8 18:34
*/
public interface UserService {
/**
* 通过sex获取用户列表
*
* @param userId
* @return
*/
List<User> findBySex(Integer userId);
- serviceImpl
package cn.cmeizu.junit.service.impl;
import cn.cmeizu.junit.dao.UserDao;
import cn.cmeizu.junit.entity.User;
import cn.cmeizu.junit.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 思念是一种痛
* @date 2020/6/8 18:34
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> findBySex(Integer sex) {
List<User> users = userDao.findBySex(sex);
List<User> result = users.stream().sorted((s1, s2) -> s1.getAge().compareTo(s2.getAge())).collect(Collectors.toList());
return result;
}
}
- 实体类
package cn.cmeizu.junit.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author 思念是一种痛
* @date 2020/6/8 18:36
*/
@Data
@AllArgsConstructor
public class User {
/**
* 用户id
*/
private Integer id;
/**
* 用户姓名
*/
private String name;
/**
* 用户年龄
*/
private Integer age;
/**
* 性别
*/
private Integer sex;
}
- dao层代码
package cn.cmeizu.junit.dao;
import cn.cmeizu.junit.entity.User;
import java.util.List;
/**
* @author 思念是一种痛
* @date 2020/6/8 18:42
*/
public interface UserDao {
/**
* 查询用户列表
*
* @param sex
* @return
*/
List<User> findBySex(Integer sex);
}
- 摸拟一下实现
package cn.cmeizu.junit.dao;
import cn.cmeizu.junit.entity.User;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author 思念是一种痛
* @date 2020/6/8 18:53
*/
@Service
public class UserDaoImpl implements UserDao {
@Override
public List<User> findBySex(Integer sex) {
return null;
}
}
- 重点来了,单测的代码
package cn.cmeizu.junit.service.impl;
import cn.cmeizu.junit.dao.UserDao;
import cn.cmeizu.junit.entity.User;
import cn.cmeizu.junit.service.UserService;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.test.context.junit4.SpringRunner;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Mockito.doReturn;
/**
* @author 思念是一种痛
* @date 2020/6/8 18:59
*/
@RunWith(SpringRunner.class)
class UserServiceImplTest {
private UserService userService;
@Test
void findByUserId() throws NoSuchFieldException, IllegalAccessException {
userService = new UserServiceImpl();
UserDao userDao = Mockito.mock(UserDao.class);
Field field = UserServiceImpl.class.getDeclaredField("userDao");
field.setAccessible(true);
field.set(userService, userDao);
List<User> users = new ArrayList<>();
users.add(new User(1, "张三", 18,1));
users.add(new User(2, "李四", 30,1));
users.add(new User(3, "王五", 35,1));
users.add(new User(4, "王二麻子", 12,1));
users.add(new User(5, "小明", 24,1));
users.add(new User(6, "李四", 19,1));
doReturn(users).when(userDao).findBySex(1);
List<User> list = userService.findBySex(1);
Assert.assertNotEquals(0, list.size());
Assert.assertEquals("王二麻子", list.get(0).getName());
}
}
-
测试结果展示
image.png -
通过上面的是没有排序的,下面经过我们的方法得到一个经过年龄排序的列表,证明我们的测试是通过了的。