美文网首页
单元测试Mockito写法介绍

单元测试Mockito写法介绍

作者: cmeizu | 来源:发表于2020-06-08 19:28 被阅读0次
    • 之前因为在做项目开发的时候,做单元测试用容器启动,现在所在的公司用的是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
    • 通过上面的是没有排序的,下面经过我们的方法得到一个经过年龄排序的列表,证明我们的测试是通过了的。

    相关文章

      网友评论

          本文标题:单元测试Mockito写法介绍

          本文链接:https://www.haomeiwen.com/subject/acqdtktx.html