Mockito-单元测试好帮手

Mockito学习

Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试.可以不进行外部依赖,快速进行Java的单元测试的进行

Mock 模拟

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法

Mockito好处

  • 无手写 : 无需自己编写模拟对象.
  • 重构安全 : 重命名接口方法名称或重新排序参数不会破坏测试代码,因为Mocks是在运行时创建的.
  • 返回值支持 : 支持返回值.
  • 异常支持 : 支持例外.
  • 订单检查支持 : 支持检查方法调用的顺序.
  • 注释支持 : 支持使用注释创建模拟.

Mockito集成

引入依赖

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>3.3.3</version>
            <scope>test</scope>
        </dependency>

Mockito的使用

初始化

    @Before
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
    }

或者

//引入依赖
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
}

注解

@Mock

用于模拟对象,有助于减少重复模拟对象

注意:@Mock注释始终与@RunWith注释一起使用。
@RunWith:这是一个类级别的注释。它用于保持测试干净并改善调试。它还会检测测试中可用的未使用的存根, 并使用@Mock注释对模拟进行初始化

@InjectMocks

它标记应在其上执行注入的字段或参数

@Captor

它允许创建字段级参数捕获器。它与Mockito的verify()方法一起使用, 以获取调用方法时传递的值。

@Spy

允许创建部分模拟的对象。换句话说, 它允许将现场实例快速包装在测试对象中

创建一个实例

package com.example.sl.demospringboot;

import com.example.sl.demospringboot.dao.UserMapper;
import com.example.sl.demospringboot.model.User;
import com.example.sl.demospringboot.service.UserService;
import com.example.sl.demospringboot.service.UserServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.List;
import java.util.Map;

import static org.mockito.Mockito.*;

//引入依赖
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    //初始化Mokc注解对象或者@RunWith(MockitoJUnitRunner.class)
//    @Before
//    public void initMocks() {
//        MockitoAnnotations.initMocks(this);
//    }
    //模拟一个对象
    @Mock
    private Map map;


    @InjectMocks
    private UserServiceImpl userServicei;
    @Mock
    private UserService userService;

    @Mock
    private UserMapper userMapper;

    @Test
    public void test1(){
        User user=mock(User.class);
        when(user.getUsername()).thenReturn("快乐");
        //当调用user.getUsername()返回“快乐”
        Assert.assertEquals("快乐",user.getUsername());
        Assert.assertTrue(map instanceof Map);
        //当调用user.getUsername()抛空指针
        Mockito.doThrow(new NullPointerException()).when(user.getUsername());
        //当调用user的时候什么事情也不用做
        Mockito.doNothing().when(user);
        map.size();
        //verify检测方法调用,这表明size方法调用一次
        verify(map,times(1)).size();
    }
    /**
     * 捕获参数
     */
    @Test
    public  void  testGetParam(){
        String param="我是一个参数";
        //模拟一个List对象
        List listO=Mockito.mock(List.class);
        ArgumentCaptor<String> paramObject = ArgumentCaptor.forClass(String.class);//捕获参数的对象

        listO.add(param);//mock对象执行add方法,将test添加进其中

        verify(listO).add(paramObject.capture());//捕获参数

        Assert.assertEquals("我是一个参数", paramObject.getValue());//断言验证

    }
    /**
     * 模拟数据库查询一个User
     */
    @Test
    public void testGetUser(){
        User user=new User();
        user.setAge(1);
        //调用方法返回一个实体
        when(userServicei.findUser()).thenReturn(user);
       // System.out.println("userService.findUser().getAge() = " + userServicei.findUser().getAge());
        Assert.assertEquals("1",userServicei.findUser().getAge()+"");
        verify(userMapper).getUser();
    }
    /**
     * 调用接口发方法进行测试
     * 设置超时时间
     */
    @Test(timeout = 1000)
    public void testInterface() throws InterruptedException {
        User user=new User();
        user.setUsername("test");
        //调用userService.findUser()返回一个usaer
        when(userService.findUser()).thenReturn(user);
        Assert.assertEquals("test",userService.findUser().getUsername());
        //验证执行几次
        verify(userService).findUser();
    }
}

注意

@InjectMocks 创建一个实例,也就是一个包含注入接口或者其他bean的一个对象

@Mock 是一个实例里面的一个注入对象,对应的是spring的一个bean

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值