JUnit5#
约 265 个字 27 行代码 预计阅读时间 6 分钟
入门案例#
- 引入依赖
XML
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
- 编写测试类
HelloTest.java
package com.luguosong.junit5demo;
import org.junit.jupiter.api.Test;
/**
* @author luguosong
*/
public class HelloTest {
@Test
void hello() {
System.out.println("hello junit5");
}
}
生命周期方法#
LifecycleTest.java
package com.luguosong.junit5demo;
import org.junit.jupiter.api.*;
/**
* @author luguosong
*/
public class LifecycleTest {
@BeforeAll
static void initAll() {
System.out.println("执行BeforeAll方法");
}
@BeforeEach
void init() {
System.out.println("执行BeforeEach方法");
}
@Test
void test1() {
System.out.println("执行测试方法1");
}
@Test
void test2() {
System.out.println("执行测试方法2");
}
@AfterEach
void tearDown() {
System.out.println("执行AfterEach方法");
}
@AfterAll
static void tearDownAll() {
System.out.println("执行AfterAll方法");
}
}
执行结果:
Text Only
执行BeforeAll方法
执行BeforeEach方法
执行测试方法1
执行AfterEach方法
执行BeforeEach方法
执行测试方法2
执行AfterEach方法
执行AfterAll方法
自定义显示名称#
DisplayNameTest.java
package com.luguosong.junit5demo;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
/**
* @author luguosong
*/
@DisplayName("测试类")
public class DisplayNameTest {
@Test
@DisplayName("测试方法")
void test() {
System.out.println("test");
}
}
断言#
概述#
Note
断言失败,后续代码不会继续执行。
assertEquals#
assertEquals用于断言两个值是否相等。
AssertEqualsTest.java
package com.luguosong.junit5demo.assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* @author luguosong
*/
public class AssertEqualsTest {
@Test
void test() {
/*
* 第一个参数为期望值,第二个参数为实际值
* */
assertEquals(3, 1 + 1);
System.out.println("test");
}
@Test
void test2() {
/*
* 第一个参数为期望值,第二个参数为实际值
* */
assertEquals(3, 1 + 1, "自定义失败消息:执行结果不是期望的3");
}
}
assertTrue#
assertTrue用于断言一个布尔值为true。
AssertTrueTest.java
package com.luguosong.junit5demo.assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* @author luguosong
*/
public class AssertTrueTest {
@Test
void test(){
assertTrue(9>10,"断言失败,结果不为True");
}
}
assertThrows#
如果抛出的异常类型与 expectedType 相同或属于其子类型,则断言通过。如果没有抛出异常,或抛出的异常类型不同,该方法将失败。
AssertThrowsTest.java
package com.luguosong.junit5demo.assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* @author luguosong
*/
public class AssertThrowsTest {
@Test
void test() {
ArithmeticException exception = assertThrows(ArithmeticException.class, () -> {
int a = 1 / 0;
});
// 会返回异常
System.out.println(exception.getMessage());
}
}
assertTimeout#
断言提供的executable的执行在给定的timeout超时之前完成。
Warning
executable将与调用代码在同一线程中执行。因此,如果超时被超过,executable的执行不会被抢占性终止。
AssertTimeoutTest.java
package com.luguosong.junit5demo.assertions;
import org.junit.jupiter.api.Test;
import static java.time.Duration.ofMinutes;
import static org.junit.jupiter.api.Assertions.assertTimeout;
/**
* @author luguosong
*/
public class AssertTimeoutTest {
@Test
void test() {
//
String actualResult = assertTimeout(
//设置超时时间
ofMinutes(2),
//执行代码
() -> {
// 执行耗时少于两分钟的任务。
return "返回结果";
}
);
System.out.println(actualResult);
}
}
assertTimeoutPreemptively#
断言提供的executable执行完毕,并且未超过给定的timeout。
AssertTimeoutPreemptivelyTest.java
package com.luguosong.junit5demo.assertions;
import org.junit.jupiter.api.Test;
import java.util.concurrent.CountDownLatch;
import static java.time.Duration.ofMillis;
import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively;
/**
* @author luguosong
*/
public class AssertTimeoutPreemptivelyTest {
@Test
void test(){
assertTimeoutPreemptively(ofMillis(10), () -> {
// 模拟耗时超过10毫秒的任务。
new CountDownLatch(1).await();
});
}
}
假设#
假设和断言的区别是:假设如果不成立,测试被标记为终止
,而不是失败。断言如果不成立测试则会被标记为失败
。
assumeTrue#
AssumeTrueTest.java
package com.luguosong.junit5demo.assume;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
/**
* @author luguosong
*/
public class AssumeTrueTest {
@Test
void test1() {
int input = 10;
assumeTrue(input > 0, "输入必须是正数");
}
@Test
void test2() {
int input = -10;
assumeTrue(input > 0, "输入必须是正数");
System.out.println("test");
}
}
assumingThat#
仅在假设成立时执行代码。
AssumingThatTest.java
package com.luguosong.junit5demo.assume;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assumptions.assumingThat;
/**
* @author luguosong
*/
public class AssumingThatTest {
@Test
void test() {
assumingThat(1 > 2,
() -> {
System.out.println("仅在假设成立时执行");
});
// 在所有环境中执行这些断言
System.out.println("总是执行");
}
}