添加pom依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!--		https://mvnrepository.com/search?q=Mockito-->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>4.4.0</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.26</version>
        </dependency>

Mockito的API

  • mock:构建一个我们需要的对象;可以mock具体的对象,也可以mock接口

  • spy:构建监控对象

  • verify:验证某种行为

  • when:当执行什么操作的时候,一般配合thenXXX 一起使用。表示执行了一个操作之后产生什么效果

  • doReturn:返回什么结果

  • doThrow:抛出一个指定异常

  • doAnswer:做一个什么相应,需要我们自定义Answer

  • times:某个操作执行了多少次

  • atLeastOnce:某个操作至少执行一次

  • atLeast:某个操作至少执行指定次数

  • atMost:某个操作至多执行指定次数

  • atMostOnce:某个操作至多执行一次

  • doNothing:不做任何处理

  • doReturn:返回一个结果

  • doThrow:抛出一个指定异常

  • doAnswer:指定一个操作,传入Answer

  • doCallRealMethod:返回真实业务执行的结果,只能用于监控对象

ArgumentMatchers参数匹配

  • anyInt:任何int类型的参数,类似的还有anyLong/anyByte等等。

  • eq:等于某个值的时候,如果是对象类型的,则看toString方法

  • isA:匹配某种类型

  • matches:使用正则表达式进行匹配

OngoingStubbing返回操作

  • thenReturn:指定一个返回的值

  • thenThrow:抛出一个指定异常

  • then:指定一个操作,需要传入自定义Answer

  • thenCallRealMethod:返回真实业务执行的结果,只能用于监控对象

Stubbing

  • 有返回的值的方法,模拟返回值

when(dictTypeDao.findById("1")).thenReturn(dictTypeOptional);

  • 有返回的值的方法,模拟抛出异常

when(dictTypeDao.findById("1")).thenThrow(new RuntimeException());

  • 无返回值void方法,模拟抛出异常

doThrow(new RuntimeException()).when(dictTypeDao).deleteById("1");

doNothing

doNothing().when(dictTypeRepository).deleteById("1");

  • 匹配参数

  • 上面的都是指定参数的,如果要匹配任意参数可以用anyString()、anyInt()、any(Class type)等等。

doThrow(new RuntimeException()).when(dictTypeRepository).deleteById(anyString());

Verify

when(mockedList.get(anyInt())).thenReturn("element");
System.out.println(mockedList.get(999));
System.out.println(mockedList.get(99));

verify(mockedList, times(1)).get(anyInt());
verify(mockedList).get(anyInt());//1次的也可以简写成这样

verify(mockedList, times(2)).get(anyInt());
verify(mockedList, atMost(2)).get(anyInt());
verify(mockedList, atLeast(2)).get(anyInt());
verify(mockedList, atLeastOnce()).get(anyInt());
verify(mockedList, never()).get(9);


package com.ruoyi.quartz.controller;


import cn.hutool.core.lang.Console;
import com.ruoyi.quartz.domain.SysJobLog;
import com.ruoyi.quartz.mapper.SysJobLogMapper;
import com.ruoyi.quartz.service.impl.SysJobLogServiceImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.test.context.junit4.SpringRunner;

import static org.mockito.Mockito.when;

@RunWith(SpringRunner.class)
class SysJobControllerTest {

    @Mock
    private SysJobLogMapper jobLogMapper;

    @InjectMocks
    private SysJobLogServiceImpl sysJobLogService;


    @BeforeEach
    public void init() {
        // 对所有注解了@Mock的对象进行模拟
        MockitoAnnotations.openMocks(this);
    }

    @Test
    void job() {
        SysJobLog sysJobLog = new SysJobLog();
        sysJobLog.setJobLogId(1L);
        sysJobLog.setJobName("job");
        sysJobLog.setJobGroup("group");
        sysJobLog.setInvokeTarget("target");
        sysJobLog.setStartTime(new java.util.Date());
        sysJobLog.setEndTime(new java.util.Date());
        sysJobLog.setJobMessage("message");
        sysJobLog.setStatus("status");
        sysJobLog.setExceptionInfo("info");
        sysJobLog.setRemark("remark");
        //模拟saveUser方法,而调用getUserById为其真实实现
        when( jobLogMapper.selectJobLogById(1L)).thenReturn(sysJobLog);
        //真实行为
        SysJobLog sysJobLog1 = jobLogMapper.selectJobLogById(1L);
        //模拟行为
        Console.log(sysJobLog1);
    }
}

文章作者: 烦恼的夏洛克
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 烦恼的夏洛克
喜欢就支持一下吧