mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用

本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用。本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山。 本文将使用mock技术模拟三种场景, 1:模拟数据库操作对象返回。2:模拟业务层操作。3:调用及实例分析 。第一步:mock环境依赖,仅导入mockito最小依赖包。配置如下:
      org.mockitogroupId>    mockito-allartifactId>    1.9.5version>  dependency>      junitartifactId>    junitgroupId>    4.11version>  dependency>dependencies>
第二步,相应数据库操作类和业务层逻辑代码。StudentDao.java
package com.yelang.mocktest.dao;import com.yelang.mocktest.entity.Student;/** * 模拟数据库访问层 * @author asus */public class StudentDao {
          /**   * 根据id查询学生信息   * @param pkId   * @return   * @throws Exception   */  public Student findByID(Long pkId) throws Exception{
          Student result = null;    if(pkId == null) {
            return result;    }    result = new Student(pkId, "杨" + pkId, Short.valueOf("1"), "湖南省长沙市岳麓区", 18);    return result;  }}
ClassInfoService.java
package com.yelang.mocktest.service;import com.yelang.mocktest.dao.StudentDao;import com.yelang.mocktest.dao.TeacherDao;import com.yelang.mocktest.entity.Student;import com.yelang.mocktest.entity.Teacher;public class ClassInfoService {
            private StudentDao studentDao;      private TeacherDao teacherDao;      public void queryInfo() throws Exception {
              Long tempPkId = 6L;        Student student = studentDao.findByID(tempPkId);        System.out.println(student.getName());        Teacher teacher = teacherDao.findById(tempPkId);        System.out.println(teacher.getName());      }}
第三步,数据库访问层以及业务逻辑层测试代码
@RunWith(MockitoJUnitRunner.class)public class StudentDaoTest {
        @Mock  private StudentDao studentDao;//模拟对象,不会在jvm中创建真实对象    @Test  public void test() throws Exception {
          Student student = new Student(1L, "张三", Short.valueOf("1"), "湖南省长沙市", 31);    //模拟调用,返回对应值,不会发生实际调用    when(studentDao.findByID(1L)).thenReturn(student);     //此时会按照模拟预期返回    Student result = studentDao.findByID(1L);      assertEquals(result.getName(), "张三");  }}
@RunWith(MockitoJUnitRunner.class)public class ClassInfoServiceTest {
        @Mock  private StudentDao studentDao;    @Mock  private TeacherDao teacherDao;    private ClassInfoService actualClassInfoService = new ClassInfoService();    /**   * 真实对象中包含部分模拟调用,比如要测ClassInfoService.queryInfo();   * ClassInfoService不能为模拟对象,要实际调用逻辑,但是方法中的对象是模拟出来的,   * 以下为模拟方法   * @throws Exception   */  @Test  public void test() throws Exception {
          //actualClassInfoService 是通过new 创建的,在jvm中实际存在    //1、通过actualClassInfoService暴露的setXXX 方法传入模拟的对象    actualClassInfoService.setStudentDao(studentDao);    actualClassInfoService.setTeacherDao(teacherDao);    Student student = new Student(6L, "张三", Short.valueOf("1"), "湖南省长沙市", 31);    //2、设置模拟对象的返回值(如果有),让业务逻辑按预设的流程进行调用    when(studentDao.findByID(6L)).thenReturn(student);    //3、同样设置其它模拟的对象(如果不需要模拟对象,请传入实际对象)    Teacher teacher = new Teacher(6L, "杨1", 43, Short.valueOf("2"));    when(teacherDao.findById(6L)).thenReturn(teacher);    //4、使用实际对象调用业务逻辑,验证真实逻辑    actualClassInfoService.queryInfo();  }}
总结,在使用mockito的过程中一定要注意mock的使用场景。如果想测试真实业务逻辑,请不要使用@mock注解,推荐使用@autowired等spring注解,否则会发生不符合期望的结果。实际情况中,mock对象和真实对象存在取舍关系,比如在一段逻辑中,只需要模拟其中一个对象,其它引用的第三方对象均已注册在springcontext中,因此按需使用mock技术,可以达到事半功倍的作用。mockito技术远比上述介绍的复杂,也更专业,本文起抛砖引玉的作用,想更深入的掌握mock技术,可以移步mockito的官网(http://mockito.org)学习。更多单元测试技术以及mock方法,可以扫描公众号交流。

mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用_第1张图片

你可能感兴趣的:(mockito,mock,void方法)