• SpringBoot与mockito那点事


    题目起的很像那么回事,但是这篇博客本身写的很简单。

    我不想写说一堆概念,然后阐释各种概念是什么意思。我喜欢的是直接从例子出发。

    package com.example.demo.controller;
    
    
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.example.demo.entity.Person;
    import com.example.demo.mapper.PersonMapper;
    import lombok.extern.slf4j.Slf4j;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    import java.util.Random;
    
    @RequestMapping({"/user"})
    @RestController
    @Slf4j
    public class UserController {
    
        @Autowired
        PersonMapper personMapper;
    
        @RequestMapping("/getUserById")
        public Person getUserById(Long id){
            Person person =personMapper.selectById(id);
            if ("张三".equals(person.getName())){
                return person;
            }
            if ("李四".equals(person.getName())){
                person.setAge(17);
                return person;
            }
            return person;
        }
    }
    
    
    具体的PersonMapper如下
    
    package com.example.demo.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.demo.entity.Person;
    import org.springframework.stereotype.Component;
    
    @Component(value = "personMapper")
    public interface PersonMapper extends BaseMapper<Person> {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    首先就是上面的例子,getUserById。
    这个方法里面的逻辑可以分为两部分,一个是通过mapper从db里面拿数据,还有就是很多额外完全没有逻辑的代码,不用管它的具体语义,反正就是写些业务逻辑。
    我现在想测试的目的就是先假定mapper本身是OK的,然后验证那些无意义的额外逻辑也是正确的。
    ok,看测试代码。

    package com.example.demo.controller;
    
    import com.example.demo.entity.Person;
    import com.example.demo.mapper.PersonMapper;
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.junit.MockitoJUnitRunner;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import static org.mockito.Mockito.when;
    
    @SpringBootTest
    @ExtendWith(MockitoExtension.class)
    public class MockitoTest {
    
        @InjectMocks
        private  UserController userController;
    
        @Mock
        private PersonMapper personMapper;
    
        @Test
        public void testGet(){
            Person person = new Person();
            person.setName("张三");
            Long id = 15L;
            when(personMapper.selectById(id)).thenReturn(person);
            Person result = userController.getUserById(id);
            Assertions.assertEquals(person,result);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    运行之后:
    在这里插入图片描述

    那pom文件呢?
    我用的是

    	<parent>
    	    <groupId>org.springframework.bootgroupId>
    	    <artifactId>spring-boot-starter-parentartifactId>
    	    <version>2.7.5version>
    	    <relativePath/> 
    	parent>
    ...
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintagegroupId>
                        <artifactId>junit-vintage-engineartifactId>
                    exclusion>
                exclusions>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    没有别的依赖了。
    ok,测试代码已经能跑了,现在就来解释代码。

    代码解释

    • @InjectMocks
      这个注解就是说我要测试被这个注解标注的类,他里面每个方法都会真正的被执行。
      换句话说,被这个注解标注的类,是我们真正想测试的类。
      InjectMocks 被这个注解标注的类,是我们真正想测试的类。
      InjectMocks 被这个注解标注的类,是我们真正想测试的类。
      InjectMocks 被这个注解标注的类,是我们真正想测试的类。

    • @Mock
      被这个注解标注的是我们想忽略的或者说,默认就认为是ok的类。

    • when
      personMapper本身就被@Mock标注了,那么其实里面的每个方法都不会真正的被执行,在UserController的Person person =personMapper.selectById(id);里面selectById就直接返回一个null。
      但是加上下面的代码
      when(personMapper.selectById(id)).thenReturn(person);
      功能我就不解释了。

  • 相关阅读:
    Parallel Context Windows for Large Language Models
    文件格式转换
    中企绕道突破封锁,防不胜防 | 百能云芯
    VS Code调试C代码
    C++入门(1):命名空间,IO流 输入输出,缺省参数
    R语言Bootstrap、百分位Bootstrap法抽样参数估计置信区间分析通勤时间和学生锻炼数据
    ArrayList和LinkedList的区别,以及应用场景
    重学c#系列——委托和匿名函数[二十五]
    论文阅读:2020GhostNet华为轻量化网络
    阿里云python训练营-Python基础学习01
  • 原文地址:https://blog.csdn.net/dlf123321/article/details/127930378