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提供的注解来标记测试方法和设置方法。以下是一个简单的示例:
javapackage 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单元测试框架,它引入了许多新特性和改进,使得编写和运行单元测试变得更容易和有趣。通过合理编写单元测试,你可以确保你的代码在不断演进的过程中保持稳定和可靠。