2023-10-15
单元测试
0

JUnit 5是Java世界中最流行的单元测试框架之一,它提供了一种简单而强大的方式来测试你的Java代码。以下是关于JUnit 5单元测试的简要介绍:

1. 单元测试的概念:

单元测试是一种软件测试方法,用于验证程序的最小单元,通常是一个函数、方法或类。它的目的是确保这些单元按照预期执行,以便在代码变更后能够快速检测潜在的问题。

2. JUnit 5的特点:

JUnit 5相对于早期版本的JUnit带来了许多改进和新特性,包括:

  • 模块化体系结构: JUnit 5被分为多个模块,如JUnit Jupiter、JUnit Platform和JUnit Vintage。JUnit Jupiter支持新的测试引擎和扩展模型,JUnit Platform允许在不同环境中执行测试,JUnit Vintage提供了兼容JUnit 4的功能。

  • 新的注解: JUnit 5引入了一些新的注解,如@Test@BeforeEach@AfterEach等,用于编写测试方法和设置方法。这些注解提供了更多的灵活性和可读性。

  • 扩展模型: JUnit 5的扩展模型允许开发者编写自定义扩展,以添加额外的功能或行为。这使得JUnit 5可以适应不同的测试需求。

  • 参数化测试: JUnit 5支持参数化测试,允许在不同输入值的情况下运行相同的测试方法。

  • 条件测试: JUnit 5引入了@EnabledOnOs@EnabledOnJre等条件注解,允许根据特定条件来启用或禁用测试。

3. 编写JUnit 5测试:

编写JUnit 5测试非常简单。只需创建一个测试类,然后在类中编写测试方法,使用JUnit提供的注解来标记测试方法和设置方法。以下是一个简单的示例:

java
package com.yieldchain.template.application.service.impl; import cn.hutool.core.io.resource.ResourceUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.yieldchain.crm.modular.bank.entity.BankCard; import com.yieldchain.crm.modular.bank.mapper.BankCardMapper; import com.yieldchain.trade.modular.trade.entity.Trade; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @Slf4j @ExtendWith(MockitoExtension.class) class PrepareBankCardTemplateDataServiceImplTest { List<BankCard> tradeBankCardList = Lists.newArrayList(); @InjectMocks private PrepareBankCardTemplateDataServiceImpl prepareBankCardTemplateDataService; @Mock private BankCardMapper bankCardMapper; @BeforeEach void setUp() { String bankCardStr = ResourceUtil.readStr("bankCard.json", Charset.defaultCharset()); tradeBankCardList = Lists.newArrayList(JSON.parseObject(bankCardStr, BankCard.class)); } @Test void prepareTemplateData() { // 准备参数 String tradeListStr = ResourceUtil.readStr("tradeList.json", Charset.defaultCharset()); List<Trade> tradeList = JSONArray.parseArray(tradeListStr, Trade.class); Map<String, Map<String, Object>> clientTemplateData = Maps.newHashMap(); // 数据库操作模拟 when(bankCardMapper.selectList(any())).thenReturn(tradeBankCardList); // 方法执行 prepareBankCardTemplateDataService.prepareTemplateData(tradeList, clientTemplateData); // 断言,无返回值的可以验证内部调用方法的执行次数 verify(bankCardMapper, times(1)).selectList(any()); } }

4. 运行测试:

可以使用IDE集成工具(如Eclipse、IntelliJ IDEA)或构建工具(如Maven、Gradle)来运行JUnit 5测试。JUnit 5会执行测试方法并报告测试结果。

总之,JUnit 5是一个强大而灵活的Java单元测试框架,它引入了许多新特性和改进,使得编写和运行单元测试变得更容易和有趣。通过合理编写单元测试,你可以确保你的代码在不断演进的过程中保持稳定和可靠。