java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot 集成JUnit5

SpringBoot 集成JUnit5的详细操作过程

作者:冬天vs不冷

JUnit5是最新的Java单元测试框架,提供了灵活的测试支持,它由JUnit Platform、JUnit Jupiter和JUnit Vintage组成,支持不同环境下的测试运行,SpringBoot从2.2版本开始默认支持JUnit5,本文介绍了SpringBoot 集成JUnit5的相关知识,感兴趣的朋友跟随小编一起看看吧

一、JUnit5介绍

  JUnit5是一个功能强大的单元测试框架,是JUnit系列的最新版本,它引入了多个改进和新特性,旨在为Java应用程序提供灵活且模块化的测试支持。

1、JUnit5组成结构

2、什么是单元测试

二、SpringBoot整合JUnit5

1、快速入门

SpringBoot版本从2.2以后,默认支持JUnit5

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

测试类应放在src/test/java目录下

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MySpringBootApplicationTests {
    @Test
    void contextLoads() {
        // 测试 Spring 应用上下文是否成功加载
    }
}

2、测试类和测试方法不需要声明为public

3、@SpringBootTest工作原理

 它会启动整个Spring容器,加载应用程序的所有Bean,并创建一个完整的应用上下文。这是集成测试,因为它模拟了应用程序的真实运行环境。

查找主配置类的两种方式:

  包扫描:默认情况下,@SpringBootTest 会从测试类所在的包开始,向上查找同一包或父包中带有 @SpringBootApplication@SpringBootConfiguration注解的类,作为应用的配置类

  显式指定:如果 @SpringBootTest 无法自动找到 @SpringBootApplication 注解的配置类,或者你希望手动指定配置类,你可以在@SpringBootTest 注解中使用classes属性显式指定应用的配置类

4、生成单元测试类

在需要生成单元测试的类中按Alt +Ins,选择test(测试)

选择测试方法

生成的测试类放入与本类相同的包结构

在这里插入图片描述

三、常用注解

1、@BeforeAll

用于在所有测试方法之前执行的静态初始化代码

通常用于在执行所有测试之前进行一次性设置,例如建立数据库连接、初始化共享资源等

被注解的方法必须是static

@BeforeAll
static void setup() {
    System.out.println("Running setup before all tests...");
}

2、@AfterAll

@AfterAll
static void tearDown() {
    System.out.println("Running teardown after all tests...");
}

3、@BeforeEach

@BeforeEach
void init() {
    System.out.println("Running setup before each test...");
}

4、@AfterEach

@AfterEach
void cleanup() {
    System.out.println("Running cleanup after each test...");
}

5、@DisplayName

用于为测试类或测试方法提供一个更具可读性或说明性的名称,便于在测试报告中展示

6、@Disabled

当执行所有测试方法时候,@Disabled注解的方法不会执行

7、@RepeatedTest

用于多次重复执行某个测试,可以指定重复次数

四、常用断言

  断言(Assertions)在单元测试中用于验证程序行为是否符合预期。JUnit 提供了一组用于编写断言的方法,断言的使用可以帮助判断测试是否通过。类名org.junit.jupiter.api.Assertions

1、assertEquals(expected, actual)

assertEquals(5, 2 + 3);
assertEquals("Hello", greetingService.getGreeting());

2、assertNotEquals(expected, actual)

验证两个对象是否不相等

assertNotEquals(10, 2 + 3);

3、assertTrue(condition)

验证条件为true

assertTrue(5 > 3);

4、assertFalse(condition)

验证条件为false

assertFalse(3 > 5);

5、assertNull(actual)

验证对象是否为null

String str = null;
assertNull(str);

6、assertNotNull(actual)

验证对象是否不为null

String str = "Hello";
assertNotNull(str);

7、assertArrayEquals(expected, actual)

验证两个数组是否相等

数组的长度和元素的顺序都必须相同

int[] expected = {1, 2, 3};
int[] actual = {1, 2, 3};
assertArrayEquals(expected, actual);

8、assertSame(expected, actual)

验证两个对象引用是否指向同一个对象(即是同一个对象的引用)

Object obj = new Object();
assertSame(obj, obj);

9、assertNotSame(expected, actual)

验证两个对象引用是否不指向同一个对象

Object obj1 = new Object();
Object obj2 = new Object();
assertNotSame(obj1, obj2);

10、fail(message)

强制使测试失败

通常用于标记不应该被执行的代码路径

if (someCondition) {
    fail("Unexpected condition occurred");
}

11、带有消息参数的断言

  JUnit的断言方法通常有一个变体,可以带有一个额外的字符串参数,用于在测试失败时提供错误消息,帮助更快找到问题。

五、@MockBean注入

1、@MockBean的主要作用

@MockBean会将应用上下文中的某个Bean替换为模拟的Bean(Mock 对象)

@MockBean自动与Spring上下文集成,允许模拟的Bean被注入到需要它的其他Bean中

2、@MockBean的典型用法(模拟数据层)

  假设我们有一个UserService依赖于UserRepository,而我们在测试中不想使用真实的UserRepository,而是使用模拟对象

@Service
public class UserService {
    private final UserRepository userRepository;
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    public User getUserById(Long id) {
        return userRepository.findById(id);
    }
}
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;
@SpringBootTest
public class UserServiceTest {
    @Autowired
    private UserService userService;
    // 模拟 UserRepository,替换掉应用上下文中的实际 Bean
    @MockBean
    private UserRepository userRepository;
    @Test
    void testGetUserById() {
        // 创建模拟数据
        User mockUser = new User(1L, "John Doe");
        // 使用 Mockito 的 BDD 风格方法设置模拟行为
        given(userRepository.findById(1L)).willReturn(mockUser);
        // 调用服务层方法,验证返回值是否符合预期
        User result = userService.getUserById(1L);
        assertEquals("John Doe", result.getName());
    }
}

到此这篇关于SpringBoot 集成JUnit5的文章就介绍到这了,更多相关SpringBoot 集成JUnit5内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文