欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单元测试:(二) 使用 mockito 对 service 层自动化测试入门

程序员文章站 2022-04-26 09:14:52
...

《单元测试:(一)在已完成的 spring + mybatis 项目中加入 dbunit 完成 dao 层自动化测试》
《单元测试:(二) 使用 mockito 对 service 层自动化测试入门》
《单元测试:(三) powermock + spring mvc mock 对 controller 层自动化测试入门》

mock 顾名思义就是模拟的意思,针对项目中某一代码层进行测试时,如果需要调用的其它类和方法环境配置复杂,对测试影响较大时,就需要先用 mock 来模拟依赖的类和方法,使测试层的测试能够独立完成,本例中使用 mockito 库实现 mock 测试。

mockito 的版本为 1.10.19

一 在 pom.xml 中加入对 mockito 的引用

<!-- mockito 测试框架 -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>${mockito.version}</version>
</dependency>

二 在需要调用 mockito 进行测试的类上使用 @RunWith(MockitoJUnitRunner.class) 注解强调使用 mockito 对本类中的测试方法进行测试。
三 在测试类中需要模拟的对象定义上方使用 @Mock 或者 @InjectMocks 注解,其中 @Mock 是对于测试类的依赖类的注解,被 @Mock 的对象所有方法都不真实调用;@InjectMocks 是对待测试类的注解,@InjectMocks 注解过的对象所有方法都会进入方法代码执行。
四 在测试方法中使用 when、assertXXX、verify 方法进行验证,验证的思路如下:
   1 使用 when 对被 @Mock 的对象中被测试类使用到的方法应该返回的值进行设置,例如被测试的类是 B类,被 @Mock 的依赖类是 A类,测试 B类的 b.insert() 方法的时候被要使用 A类的 a.update()方法,而且需要该方法返回 1,那就需要使用 when(a.update()).thenReturn(1)
   2 使用 assertXXX 方法(例如 assertTrue)验证被测试类的被测试方法返回了期望值
   3 验证依赖类的依赖方法被调用过
   示例代码片段如下:

import net.ioooi.practice.base.dao.AdminMapper;
import net.ioooi.practice.base.domain.Admin;
import net.ioooi.practice.base.model.AdminShortListItem;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;

import java.util.List;

import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
 * Created by bel on 2017/4/14.
 */
@RunWith(MockitoJUnitRunner.class) 
public class AdminServiceTest {

    @Mock // 定义 dao 层对象
    private AdminMapper adminMapper;
    @Mock
    private List<AdminShortListItem> list;
    @InjectMocks // 定义被测试类的对象
    private AdminService adminService = new AdminServiceImpl();

    @Test
    public void testRegist() {
        Admin admin = new Admin();
        when(adminMapper.insert(any(Admin.class))).thenReturn(1); // 当依赖对象 adminMapper 的 insert 方法被测试对象 adminService 的 regist 方法调用的时候返回 1,其中 any(Admin.class) 是指 insert 的参数只要是 Admin 类就行
        assertTrue(adminService.regist(admin)); // 验证被测试对象 adminService 的 regist 方法调用后正常执行
        verify(adminMapper, times(1)).insert(any(Admin.class)); // 验证依赖对象 adminMapper 的 insert 方法确实被调用了一次, times(1) 指的就是调用了一次。
    }
}

 

转载于:https://my.oschina.net/ioooi/blog/1526325