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

Springboot中的单元测试该如何进行?

在 Spring Boot 应用程序中,单元测试是确保代码质量和功能正确性的关键部分。Mockito 是一个流行的Java测试框架,用于模拟(mocking)对象,使得编写单元测试更加容易和高效。本文将介绍如何在Spring Boot 应用程序中使用 Mockito 进行单元测试。

1. 添加依赖

spring-boot-starter-test已经包含了 Mockito 依赖,所以只需在pom.xml文件中添加:

 
  1.    <dependency>

  2.    <groupId>org.springframework.boot</groupId>

  3.    <artifactId>spring-boot-starter-test</artifactId>

  4.    <version>x.x.x</version> <!-- 使用对应版本 -->

  5.    <scope>test</scope>

  6.    </dependency>

2. 编写单元测试

假设我们有一个简单的服务类UserService:

 
  1.   @Service

  2.   public class UserService {

  3.    @Autowired

  4.    private UserRepository userRepository;

  5.    public String getUserRole(String username) {

  6.    User user = userRepository.findByUsername(username);

  7.    if (user != null) {

  8.    return user.getRole();

  9.    }

  10.    return null;

  11.    }

  12.   }

我们将使用 Mockito 来模拟UserRepository,而不是实际调用数据库。以下是单元测试的示例:

 
  1.   public class UserServiceTest {

  2.    @Mock

  3.    private UserRepository userRepository;

  4.    @InjectMocks

  5.    private UserService userService;

  6.    @Test

  7.    public void testGetUserRole() {

  8.    // 设置模拟的 UserRepository 行为

  9.    User mockUser = new User("testuser", "ROLE_USER");

  10.    Mockito.when(userRepository.findByUsername("testuser")).thenReturn(mockUser);

  11.    // 调用服务方法

  12.    String role = userService.getUserRole("testuser");

  13.    // 验证是否调用了 UserRepository 的 findByUsername 方法

  14.    Mockito.verify(userRepository).findByUsername("testuser");

  15.    // 验证结果

  16.    assertEquals("ROLE_USER", role);

  17.    }

  18.    @Test

  19.    public void testGetUserRole_UserNotFound() {

  20.    // 设置模拟的 UserRepository 行为

  21.    Mockito.when(userRepository.findByUsername("nonexistentuser")).thenReturn(null);

  22.    // 调用服务方法

  23.    String role = userService.getUserRole("nonexistentuser");

  24.    // 验证是否调用了 UserRepository 的 findByUsername 方法

  25.    Mockito.verify(userRepository).findByUsername("nonexistentuser");

  26.    // 验证结果

  27.    assertNull(role);

  28.    }

  29.   }

3. 解释

  ·@Mock:这个注解创建一个模拟对象。在本例中,我们模拟了UserRepository。

  · @InjectMocks:这个注解将Mock对象注入到被测试的对象中。在本例中,我们将模拟的UserRepository注入到UserService中。

  · Mockito.when().thenReturn():这个方法用于设置模拟对象的行为。我们告诉 Mockito 当调用userRepository.findByUsername()时应该返回什么值。

  · Mockito.verify(userRepository).findByUsername("testuser"):verify方法用来验证是否调用了模拟对象的特定方法,并且传入了期望的参数。

  · 最后,我们调用assert方法并验证返回结果是否符合预期。

4. 总结

通过使用Mockito,我们可以轻松地模拟外部依赖项,使得单元测试更加简单和可靠。在Spring Boot应用程序中,这对于测试业务逻辑而不依赖于外部资源(如数据库)至关重要。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   


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

相关文章:

  • 从社交媒体到元宇宙:Facebook未来发展新方向
  • 建筑施工特种作业人员安全生产知识试题
  • 某app最新版 vmp算法分析一
  • python高效处理大数据:将Excel10万数据分批插入MySQL数据库的实战代码
  • MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?
  • 并发基础:(淘宝笔试题)三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串【举一反三】
  • 在职场,多少人输在不懂人情世故上!这12条人情世故,你懂几条?
  • C#中日期和时间的处理
  • 15分钟学 Go 第 45 天 : 使用Docker容器
  • Leetcode 778 Swim in a Rising water
  • (十三)JavaWeb后端开发——MySQL2
  • Spring的异步详解(@Async)
  • arkUI:层叠布局(Stack)
  • 测试概念以及测试bug
  • cannot locate symbol _ZTVNSt6__ndk119basic_ostringstreamIcNS_
  • 自动化细胞核分割与特征分析
  • 如何利用动态住宅IP高效抓取亚马逊数据并避开封禁
  • react的创建与书写
  • node.js安装配置(Windows)
  • 我应该如何使用这个API接口来展示商品信息呢
  • 【图像与点云融合教程(五)】海康相机 ROS2 多机分布式实时通信功能包
  • 美的品牌店铺运营全解析:洞察用户行为驱动增长
  • 【excel基本操作-sumif绝对引用和相对引用
  • 《Atomic Picnic》进不去游戏解决方法
  • 呼叫中心外呼主要用于哪些场景?
  • 【ARM Linux 系统稳定性分析入门及渐进 1.9.1 -- Crash 命令 System State 集合】