秒懂如何使用SpringBoot+Junit4进行单元测试

本文介绍如何使用AssertJ进行断言测试,使用JMockit进行Mock测试,以及如何利用Maven进行测试集成,包括测试报告和覆盖率的查看。

在这里插入图片描述

一、目标

  • 学会基于AssertJ的断言技术;
  • 学会基于AssertJ-DB的数据库断言技术
  • 学会基于JMockit的mock技术;
  • 学会内存和数据库的造数;
  • 学会集成Maven进行单元测试、集成测试的执行;
  • 学会查看测试覆盖率;

二、断言技术

断言库包含很多,比如junit自带的、hamcrest等,这里推荐使用AssertJ,看它的官网就知道了,宣称fluent assertions java library

2.1 核心库断言

AssertJ的断言采用assertThat(result)的形式,等同于then(result),这两种方式使用上没有区别;我们需要在pom中引入如下依赖:

        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.15.0</version>
            <scope>test</scope>
        </dependency>

下面列出常见的断言用法,其它的用法可以参考依赖库学习使用。

  • 对文本的断言;

    assertThat(result).isEqualTo("apple");
    assertThat(result).isEqualToIgnoringCase("apple");
    assertThat(result).contains("apple");
    assertThat(result).containsIgnoringCase("apple");
    assertThat(result).startsWith("apple");
    assertThat(result).matches("^[A-Za-z0-9]{8}$");
    assertThat(result).hasSize(10);
    assertThat(result).containsSequence("a", "p", "l");
    ...
    
  • 对数字的断言;

    assertThat(result).isGreaterThanOrEqualTo(100);
    assertThat(result).isCloseTo(100.0, Offset.offset(0.000001));
    assertThat(result).isBetween(90.0, 91.0),
    assertThat(result).isNaN();
    ...
    
  • 对日期的断言;

    assertThat(result).isAfter(startDate);
    assertThat(result).isBefore("2020-01-01");
    assertThat(result).isInSameMonthAs("2019-12-01");
    ...
    
  • 对集合的断言;

    assertThat(result).hasSize(3);
    assertThat(result).contains("apple", "orange");
    assertThat(result).doesNotcontain("apple", "orange");
    assertThat(result).containsExactly("apple", "orange");
    assertThat(result).startsWith("apple");
    assertThat(result).endsWith("orange");
    assertThat(result).doesNotContainNull();
    assertThat(result).doesNotHaveDuplicates();
    assertThat(result).isNotEmpty();
    assertThat(result).isNullOrEmpty();
    ...
    assertThat(result).hasSize(2<
### 如何在Spring Boot项目中使用JUnit进行单元测试 #### 添加依赖 为了在Spring Boot项目中启用JUnit单元测试功能,需要在`pom.xml`文件中加入以下依赖项[^1]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` 此依赖会自动引入JUnit库以及Spring Test模块所需的其他组件。 --- #### 编写简单的单元测试类 下面是一个基本的Spring Boot单元测试示例: ```java import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class ExampleServiceTest { private static final Logger logger = LoggerFactory.getLogger(ExampleServiceTest.class); @Autowired private ExampleService exampleService; // 假设有一个名为ExampleService的服务类 @Test public void testExampleMethod() { String result = exampleService.exampleMethod(); logger.info("Result from service method: {}", result); // 验证服务方法的结果是否符合预期 assert "Expected Result".equals(result); } } ``` 在此代码片段中,`@SpringBootTest`注解负责加载整个Spring应用上下文并初始化所有Bean实例。这使得可以注入和测试任何Spring管理的对象。 --- #### 使用参数化测试 如果希望针对多种输入条件运行相同的测试逻辑,则可采用参数化测试的方式。以下是基于JUnit 5的一个例子[^2]: ```java import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ParameterizedTestExample { private static final Logger logger = LoggerFactory.getLogger(ParameterizedTestExample.class); @ParameterizedTest @EnumSource(Season.class) public void testWithEnumParameters(Season season) { logger.info("Testing with parameter: {}", season.name()); } enum Season { SPRING, SUMMER, AUTUMN, WINTER } } ``` 这里利用了`@ParameterizedTest`与`@EnumSource`组合来实现枚举类型的自动化测试覆盖。 --- #### Web环境下的单元测试 对于涉及Web层的测试需求(比如控制器),可以通过如下方式构建测试案例[^4]: ```java import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class WebControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext webApplicationContext; @BeforeEach public void setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build(); } @Test public void testEndpointResponse() throws Exception { mockMvc.perform(get("/api/example")) .andExpect(status().isOk()) .andExpect(content().string(containsString("example"))); } } ``` 上述代码展示了如何通过MockMvc工具模拟HTTP请求,并验证响应状态码及内容是否满足期望值。 --- #### 数据库交互测试 当业务逻辑包含数据库操作时,推荐结合H2内存数据库完成隔离性强的数据访问层测试[^5]: ```java @SpringBootTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) class RepositoryTest { @Autowired private UserRepository userRepository; @Test void saveAndFindUser() { User user = new User(); user.setName("John Doe"); userRepository.save(user); Optional<User> foundUser = userRepository.findById(user.getId()); assertTrue(foundUser.isPresent()); assertEquals("John Doe", foundUser.get().getName()); } } ``` 此处借助`@AutoConfigureTestDatabase`替换默认数据源至临时存储介质,从而避免影响生产环境中的真实记录。 --- ### 总结 以上分别介绍了几种常见的Spring Boot下运用JUnit执行单元测试的方法论及其实践技巧。无论是简单函数校验还是复杂场景重现均能依据具体诉求灵活选用相应策略加以应对。
评论 69
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掂掂三生有幸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值