当前位置: 首页 > news >正文

Junit+Mock

base project

<parent>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.6.11</version>
     <relativePath/>
 </parent>
 
<dependencies>
   <!--添加mysql依赖-->
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>2.7.2</version>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.2</version>
    </dependency>

    <!--单元测试-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!--junit4-->
    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

application.yaml

server:
  port: 8896

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mariadb://local_IP_replace:3306/junit?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: org.mariadb.jdbc.Driver

controller

@RestController
@RequestMapping("/ele")
public class EleController {

    private final IEleService eleService;


    @Autowired
    public EleController(IEleService eleService) {
        this.eleService = eleService;
    }

    @GetMapping(value = "/selectEleById")
    public Result<Object> selectEleById(@RequestParam(value = "orderId") int orderId) {
        Object object = eleService.selectEleById(orderId);
        return Result.success(object);
    }

    @GetMapping(value = "/selectEleByIdAndName")
    public Result<Object> selectEleByIdAndName(
            @RequestParam(value = "id") int id, @RequestParam(value = "name") String name) {
        Object object = eleService.selectEleByIdAndName(id,name);
        return Result.success(object);
    }
}

service

public interface IEleService {
    Object selectEleById(int orderId);
    Object selectEleByIdAndName(int id, String name);
}
@Service
public class EleService implements IEleService {
    @Autowired
    private IElementsMapper elementsMapper;
    @Override
    public Object selectEleById(int orderId) {
        ElementsDO elementsDO = elementsMapper.selectById(orderId);
        return elementsDO;
    }

    @Override
    public Object selectEleByIdAndName(int id, String name) {
        LambdaQueryWrapper<ElementsDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ElementsDO::getId, id);
        queryWrapper.eq(ElementsDO::getElementName, name);
        ElementsDO elementsDO = elementsMapper.selectOne(queryWrapper);
        return elementsDO;
    }
}

mapper

@Mapper
public interface IElementsMapper extends BaseMapper<ElementsDO> {
}

entity

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("ELEMENTS")
public class ElementsDO implements Serializable {
    /**
     * id
     */
    @TableId(value = "ID", type = IdType.AUTO)
    private Integer id;
    /**
     * 要素代码
     */
    @TableField(value = "ELEMENT_CODE")
    private String elementCode;
    /**
     * 要素名称
     */
    @TableField(value = "ELEMENT_NAME")
    private String elementName;
    /**
     * 单位
     */
    @TableField(value = "UNIT")
    private String unit;
}

controller返回封装对象

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result<T> {
    private int code;
    private String msg="success";
    private T data;

    /**
     *  成功时候的调用
     * */

    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 1;
        return result;
    }

    public static<T> Result<T> success(T data){
        return new Result<T>(data);
    }

    /**
     *  失败时候的调用
     * */
    public static  <T> Result<T> error(CodeMsg codeMsg){
        return new Result<T>(codeMsg);
    }

    private Result(T data) {
        this.data = data;
    }

    private Result(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    private Result() {
    }

    private Result(CodeMsg codeMsg) {
        if(codeMsg != null) {
            this.code = codeMsg.getCode();
            this.msg = codeMsg.getMsg();
        }
    }


    /**
     * BindingResult统一处理
     */
    public static Result resolveBindResult(BindingResult bindingResult){
        StringBuilder stringBuilder = new StringBuilder();
        for (String s : bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.toList())) {
            stringBuilder.append(",").append(s);
        }
        return Result.error(new CodeMsg(502,stringBuilder.toString().substring(1)));
    }

    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Result [code=" + code + ", msg=" + msg + ", data=" + data + "]";
    }

}

Mock初始化

方式1

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class Init1 {
    //初始化模拟对象
    @Mock
    private EleService eleService;
    //初始化真实对象
    @Spy
    private EleService eleService2;

    @Test
    public void test1(){
        boolean mock = Mockito.mockingDetails(eleService).isMock();
        System.out.println(mock);

        boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();
        System.out.println(mock1);
    }
}

方式2

import org.junit.jupiter.api.BeforeEach;
@ExtendWith(MockitoExtension.class)
public class Init2 {
    private EleService eleService;
    //初始化
    @BeforeEach
    public void init() {
        eleService = Mockito.mock(EleService.class);
    }

    @Test
    public void test1(){
        //判断对象是否为muck对象
        boolean mock = Mockito.mockingDetails(eleService).isMock();
        System.out.println(mock);
    }
}

方式3

import org.junit.jupiter.api.BeforeEach;
@ExtendWith(MockitoExtension.class)
public class Init3 {
    //初始化模拟对象
    @Mock
    private EleService eleService;
    //初始化真实对象
    @Spy
    private EleService eleService2;

    //初始化
    @BeforeEach
    public void init() {
        //初始化当前类对象下的相关mock
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void test1(){
        boolean mock = Mockito.mockingDetails(eleService).isMock();
        System.out.println(mock);

        boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();
        System.out.println(mock1);
    }
}

Mock默认返回值

int默认返回0,对象默认返回null,集合默认返回空集合(空的ArrayList、空的HashSet、空的HashMap)

@ExtendWith(MockitoExtension.class)
public class MockMethod1 {
    //初始化模拟对象
    @Mock
    private EleService eleService;

    @Test
    public void test1(){
        //Mock对象返回默认值,不会调用真正方法
        Object o1 = eleService.selectEleById(1);//null
        System.out.println(o1);
    }
}

Mock参数设置

@ExtendWith(MockitoExtension.class)
public class MockMethod1 {
    //初始化模拟对象
    @Mock
    private EleService eleService;

    @Test
    public void test1(){
        /**
         * 插桩,只拦截参数为1
         */
        //指定参数为1时,selectEleById方法时返回new Object()
        Mockito.doReturn(new Object()).when(eleService).selectEleById(1);
        Object o2 = eleService.selectEleById(1);
        System.out.println(o2);//java.lang.Object@16b2bb0c
    }

    @Test
    public void test2(){
        /**
         * 插桩,拦截selectEleById()的任意参数值
         */
        Mockito.doReturn(new Object()).when(eleService).selectEleById(ArgumentMatchers.any(Integer.class));
        Object o2 = eleService.selectEleById(2);
        System.out.println(o2);//java.lang.Object@c7045b9
    }
}

文章转载自:

http://lmfxqiSw.mdhdr.cn
http://y61CWSZq.mdhdr.cn
http://BkSXibHH.mdhdr.cn
http://DeUAT6ST.mdhdr.cn
http://QKSTsyrW.mdhdr.cn
http://2L2RISbE.mdhdr.cn
http://g91gLtvP.mdhdr.cn
http://zo3sdsB8.mdhdr.cn
http://gpTJYdII.mdhdr.cn
http://yM3ycfCx.mdhdr.cn
http://EtCGJBiW.mdhdr.cn
http://5O5cEEAA.mdhdr.cn
http://BoGWzMow.mdhdr.cn
http://A6CdGJv9.mdhdr.cn
http://U4zjufBt.mdhdr.cn
http://6FetI7R1.mdhdr.cn
http://09XSX9Wf.mdhdr.cn
http://ODqui6LX.mdhdr.cn
http://KNqv5eD7.mdhdr.cn
http://2NjoTNC4.mdhdr.cn
http://RUxHhdft.mdhdr.cn
http://aBvooWQ7.mdhdr.cn
http://VGhtfYHY.mdhdr.cn
http://qV8R88D4.mdhdr.cn
http://FCNCyjzC.mdhdr.cn
http://9fOeoWAX.mdhdr.cn
http://5QdIPtnH.mdhdr.cn
http://DOwAWZtt.mdhdr.cn
http://dz2dMncP.mdhdr.cn
http://bSmNi2vf.mdhdr.cn
http://www.dtcms.com/a/36129.html

相关文章:

  • Tag标签的使用
  • 一篇文章学懂Vuex
  • 汽车4S行业的信息化特点与BI建设挑战
  • Docker 的安全配置与优化(一)
  • deepseek 导出导入模型(docker)
  • GO 进行编译时插桩,实现零码注入
  • 数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
  • Unity制作游戏项目——Unity项目如何导出安装包(Inno Setup Compiler的使用)——附有Inno Setup Compiler软件安装包
  • 利用开源AI智能名片2+1链动模式S2B2C商城小程序构建企业私域流量池的策略与实践
  • 尚硅谷爬虫note010
  • PostgreSQL:更新字段慢
  • 在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)
  • Vue03
  • 20250223下载并制作RTX2080Ti显卡的显存的测试工具mats
  • Java数据结构第十三期:走进二叉树的奇妙世界(二)
  • git branch
  • Kafka集群性能测试实战指南:从规划到验证,全面掌握高效测试方案
  • 基于deepseek的AI知识库系统搭建
  • STM32——HAL库开发笔记21(定时器2—输出比较)(参考来源:b站铁头山羊)
  • 【Python爬虫(63)】从0到1:打造图片与视频爬虫攻略
  • Java+SpringBoot+Vue+数据可视化的美食餐饮连锁店管理系统
  • 【SpringBoot】【JWT】使用JWT的claims()方法存入Integer类型数据自动转为Double类型
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_add_inherited_sockets函数
  • 性能测试-笔记
  • 【前端】Axios AJAX Fetch
  • 解析CV/多模态算法的要点及技术特点,弥补单模态信息不足的多模态应用的哪些场景中?
  • 互联网摸鱼日报(2025-02-24)
  • 【cuda学习日记】4.3 结构体数组与数组结构体
  • 【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
  • SOME/IP-SD -- 协议英文原文讲解2