- 前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要
| # assumingThat 的参数是表示条件的布尔值和对应的 Executable 接口的实现对象。只有条件满足时,Executable 对象才会被执行;当条件不满足时,测试执行并不会终止 |
| |
| @DisplayName("前置条件") |
| public class AssumptionsTest { |
| private final String environment = "DEV"; |
| |
| @Test |
| @DisplayName("simple") |
| public void simpleAssume() { |
| assumeTrue(Objects.equals(this.environment, "DEV")); |
| assumeFalse(() -> Objects.equals(this.environment, "PROD")); |
| } |
| |
| @Test |
| @DisplayName("assume then do") |
| public void assumeThenDo() { |
| assumingThat( |
| Objects.equals(this.environment, "DEV"), |
| () -> System.out.println("In DEV") |
| ); |
| } |
| } |
- JUnit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制
| @DisplayName("A stack") |
| class TestingAStackDemo { |
| |
| Stack<Object> stack; |
| |
| @Test |
| @DisplayName("is instantiated with new Stack()") |
| void isInstantiatedWithNew() { |
| new Stack<>(); |
| } |
| |
| @Nested |
| @DisplayName("when new") |
| class WhenNew { |
| |
| @BeforeEach |
| void createNewStack() { |
| stack = new Stack<>(); |
| } |
| |
| @Test |
| @DisplayName("is empty") |
| void isEmpty() { |
| assertTrue(stack.isEmpty()); |
| } |
| |
| @Test |
| @DisplayName("throws EmptyStackException when popped") |
| void throwsExceptionWhenPopped() { |
| assertThrows(EmptyStackException.class, stack::pop); |
| } |
| |
| @Test |
| @DisplayName("throws EmptyStackException when peeked") |
| void throwsExceptionWhenPeeked() { |
| assertThrows(EmptyStackException.class, stack::peek); |
| } |
| |
| @Nested |
| @DisplayName("after pushing an element") |
| class AfterPushing { |
| |
| String anElement = "an element"; |
| |
| @BeforeEach |
| void pushAnElement() { |
| stack.push(anElement); |
| } |
| |
| @Test |
| @DisplayName("it is no longer empty") |
| void isNotEmpty() { |
| assertFalse(stack.isEmpty()); |
| } |
| |
| @Test |
| @DisplayName("returns the element when popped and is empty") |
| void returnElementWhenPopped() { |
| assertEquals(anElement, stack.pop()); |
| assertTrue(stack.isEmpty()); |
| } |
| |
| @Test |
| @DisplayName("returns the element when peeked but remains not empty") |
| void returnElementWhenPeeked() { |
| assertEquals(anElement, stack.peek()); |
| assertFalse(stack.isEmpty()); |
| } |
| } |
| } |
| } |
| 利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。 |
| |
| @ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型 |
| @NullSource: 表示为参数化测试提供一个null的入参 |
| @EnumSource: 表示为参数化测试提供一个枚举入参 |
| @CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参 |
| @MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流) |
| |
| # 案例 |
| @ParameterizedTest |
| @ValueSource(strings = {"one", "two", "three"}) |
| @DisplayName("参数化测试1") |
| public void parameterizedTest1(String string) { |
| System.out.println(string); |
| Assertions.assertTrue(StringUtils.isNotBlank(string)); |
| } |
| |
| @ParameterizedTest |
| @MethodSource("method") |
| @DisplayName("方法来源参数") |
| public void testWithExplicitLocalMethodSource(String name) { |
| System.out.println(name); |
| Assertions.assertNotNull(name); |
| } |
| |
| static Stream<String> method() { |
| return Stream.of("apple", "banana"); |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?