跳转至

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("总是执行");
    }
}
此页面是否有帮助?

评论