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

改BUG:Mock测试的时候,when失效

问题再现:

这里我写了一测试用户注册接口的测试类,并通过when模拟下层的服务,但实际上when并没有奏效,还是走了真实的service层的逻辑。

package cn.ac.evo.review.test;

import cn.ac.evo.review.user.UserMainApplication;
import cn.ac.evo.review.user.register.controller.UserRegisterController;
import cn.ac.evo.review.user.register.model.dto.RegisterDTO;
import cn.ac.evo.review.user.register.service.IUserRegisterService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;

/**
 * @author urfread
 * @date 2025-02-20 09:34
 */
@SpringBootTest(classes = UserMainApplication.class)
@AutoConfigureMockMvc
public class UserRegisterTest {
    @Autowired
    private MockMvc mockMvc;
    private RegisterDTO registerDTO;

    @Mock
    private IUserRegisterService userRegisterService;  // 模拟服务层

    @BeforeEach
    public void setUp() {
        registerDTO = new RegisterDTO("3131015733@qq.com", "123456", "123456");
    }

    // 测试邮箱是否已注册
    @Test
    public void testCheckEmailRegisteredSuccess() throws Exception {
        // 模拟服务层返回的结果
        when(userRegisterService.checkEmailRegistered(registerDTO.getEmail())).thenReturn(true);

        mockMvc.perform(get("/api/user/register/checkEmailRegistered")
                        .param("email", registerDTO.getEmail()))
                .andExpect(status().isOk())
                .andExpect(content().string("true"));
    }

    @Test
    public void testCheckEmailRegisteredFail() throws Exception {
        // 模拟服务层返回的结果
        when(userRegisterService.checkEmailRegistered(registerDTO.getEmail())).thenReturn(false);

        mockMvc.perform(get("/api/user/register/checkEmailRegistered")
                        .param("email", registerDTO.getEmail()))
                .andExpect(status().isOk())
                .andExpect(content().string("false"));
    }
}

解决

只改一行就可以

@Mock
private IUserRegisterService userRegisterService;  // 模拟服务层

把这里的 @Mock 改为 @MockBean,然后 when 就又奏效了。
就是这么简单,有研究了20分钟。


http://www.kler.cn/a/555928.html

相关文章:

  • 深入解析 Uniapp 的页面结构
  • 【蒸馏(1)】UniDistill:用于BEV 3D检测的通用跨模态蒸馏框架!
  • 量子比特的实现与优化技术:解密量子计算的核心
  • 《耀百岁中医养生平台的技术革命——千年中医的智能觉醒》
  • HarmonyOS NEXT 前沿技术理论解析与学习路径(API 12+)
  • C# WPF调用C++ dll 结合opencv
  • AcWing走迷宫-最短路问题-BFS求解
  • 解决Spring Data JPA set值后自动更新到数据库问题
  • 第一个CMAKE项目hello cmake
  • QT基础八、与时间相关的UI控件
  • 【鸿蒙开发】第四十三章 Notification Kit(用户通知服务)
  • ClickHouse分布式高可用实战:ReplicatedMergeTree引擎深度解析与代码实践
  • LangChain:AI大模型开发与分布式系统设计
  • 2000字,极简版华为数字化转型方法论
  • strapi4,strapi5最新版安装部署教程
  • 蓝桥杯刷题0220
  • MCU Bootloader具备什么条件才能跳转到APP程序
  • 详解同为科技桌面PDU系列产品特点
  • 动态对冲策略
  • 端边云架构