国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring boot 單元測試JUnit5使用斷言Assertions和假定Assumptions、嵌套、參數(shù)測試

這篇具有很好參考價(jià)值的文章主要介紹了spring boot 單元測試JUnit5使用斷言Assertions和假定Assumptions、嵌套、參數(shù)測試。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

spring boot 單元測試JUnit5使用斷言Assertions和假定Assumptions、嵌套、參數(shù)測試

本文基于spirng boot 2.7.11, 大家注意自己的版本

Spring Boot 2.2.0 版本開始引入 JUnit 5 作為單元測試默認(rèn)庫

SpringBoot 2.4 以上版本移除了默認(rèn)對 Vintage 的依賴

源碼地址:https://gitcode.net/qq_39339588/springboot.git

1. 標(biāo)記單元測試類和方法

@SpringBootTest注解,可以標(biāo)記為測試類

@Test注解標(biāo)記是測試方法

@DisplayName注解是標(biāo)記個(gè)名稱

@SpringBootTest
public class HelloWorldTest {
    /**
     * 斷言基礎(chǔ)
     */
    @Test
    @DisplayName("簡單斷言")
    public void simple() {
    }
}
2. 斷言的簡單使用
1)基本類型和對象的斷言
/**
* 基本類型和對象的斷言
*/
@Test
@DisplayName("簡單斷言")
public void simple() {
    Assertions.assertEquals(3, 1 + 2, "不相等");
    Assertions.assertNotEquals(3, 1 + 1, "相等了");

    //斷言對象
    Assertions.assertNotSame(new Object(), new Object(), "對象相同");
    Object o = new Object();
    Assertions.assertSame(o, o, "斷言不相等了");

    Assertions.assertFalse(1 > 2);
    Assertions.assertTrue(1 < 2);
    Assertions.assertNull(null);
    Assertions.assertNotNull(new Object());
}
2)數(shù)組斷言
@DisplayName("數(shù)組斷言")
@Test
public void array() {
    // 斷言兩個(gè)數(shù)組對象不相等
    Assertions.assertNotEquals(new int[]{1, 2}, new int[]{1, 2});
}
3)組合斷言
@DisplayName("組合斷言")
@Test
public void all() {
    // 斷言所多個(gè)斷言方法都正確
    Assertions.assertAll("組合斷言",
            () -> Assertions.assertEquals(2, 1 + 1),
            () -> Assertions.assertTrue(1 > 0)
    );
}
4)異常斷言
@DisplayName("異常斷言")
@Test
public void exception() {
    // 斷言方法 會出現(xiàn)異常
    ArithmeticException arithmeticException = Assertions.assertThrows(ArithmeticException.class, 
            () -> System.out.println(1 % 0));
    arithmeticException.printStackTrace();
}
5)超時(shí)斷言
@DisplayName("超時(shí)斷言")
@Test
public void timeOut() {
    // 斷言方法執(zhí)行不會超過1秒
    Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(500));
}
6)快速失敗斷言
@DisplayName("快速失敗")
@Test
public void failFast() {
    // 觸發(fā)快速失敗后
    AssertionFailedError ex = Assertions.assertThrows(AssertionFailedError.class, () -> {
        Assertions.fail("觸發(fā)快速失敗");
    });
    ex.printStackTrace();
}
3. 前置條件斷言,假設(shè)假定

執(zhí)行斷言的前提條件,如果假定成功true,才會去執(zhí)行

/**
 * 前置條件,假設(shè)假定
 */
@DisplayName("前置條件")
@Test
public void assuming() {
    String evn = "dev";
    // 執(zhí)行斷言的前提條件,如果假定成功true,才會去執(zhí)行下一行,如果假定失敗,下邊的就不執(zhí)行了
    Assumptions.assumeTrue(Objects.equals(evn, "dev"));
    Assumptions.assumeFalse(Objects.equals(evn, "prod"));
    System.out.println("dev和不是prod,執(zhí)行了");
    Assumptions.assumeTrue(Objects.equals(evn, "dev1"));
    System.out.println("dev1,這句會忽略,不會執(zhí)行輸出");
}


/**
 * 假定成功true,才會去執(zhí)行 執(zhí)行器方法
 */
@DisplayName("前置條件That")
@Test
public void assumingThat() {
    // 假定成功,才會去執(zhí)行 執(zhí)行器方法
    Assumptions.assumingThat(
            Objects.equals("dev", "dev"), () -> {
                System.out.println("in dev");
            }
    );
}
4. 嵌套@Nested

內(nèi)部嵌套,每次會先走外層的beforeEach,在走內(nèi)部的beforeEach;支持嵌套的嵌套

@DisplayName("單元測試示例")
@SpringBootTest
public class HelloWorldTest {
    
    Stack<Object> stack;

    /**
     * 內(nèi)部嵌套,每次會先走外層的beforeEach,在走內(nèi)部的beforeEach
     */
    @DisplayName("內(nèi)部嵌套測試")
    @Nested
    class InnerTest {
        @BeforeEach
        void newStack() {
            // 創(chuàng)建一個(gè)棧對象
            stack = new Stack<>();
        }

        @DisplayName("檢查是否為空")
        @Test
        void isEmpty() {
            Assertions.assertTrue(stack.isEmpty());
        }

        @DisplayName("拋出一個(gè)棧pop異常")
        @Test
        void throwExceptionWhenPop() {
            Assertions.assertThrows(EmptyStackException.class, stack::pop);
        }

        @DisplayName("拋出一個(gè)棧peek異常")
        @Test
        void throwExceptionWhenPeek() {
            Assertions.assertThrows(EmptyStackException.class, stack::peek);
        }

        @Nested
        @DisplayName("內(nèi)部的內(nèi)部嵌套測試")
        class InnerInnerTest {
            String item = "item";

            @BeforeEach
            void pushAnItem() {
                // 放入一個(gè)元素
                stack.push(item);
            }

            @DisplayName("不為空了")
            @Test
            void isNotEmpty() {
                Assertions.assertFalse(stack.isEmpty());
            }

            @DisplayName("取出一個(gè)來,用pop")
            @Test
            void returnItemByPop() {
                Assertions.assertEquals(item, stack.pop());
                Assertions.assertTrue(stack.isEmpty());
            }

            @DisplayName("取出一個(gè)來,用peek")
            @Test
            void returnItemByPeek() {
                Assertions.assertEquals(item, stack.peek());
                Assertions.assertFalse(stack.isEmpty());
            }
        }

    }
5. 參數(shù)化測試

參數(shù)化測試,讓單元測試的方法支持接收傳入的參數(shù)

將可以使用不同的參數(shù)進(jìn)行多次單元測試,有多少套參數(shù),就執(zhí)行多少次單元測試

而不需要每新增一個(gè)參數(shù)就新增一個(gè)單元測試,省去了很多冗余代碼

1)@ValueSource注解,基本類型入?yún)?/h6>
/**
 * @ValueSource:為參數(shù)化測試指定入?yún)碓?,支持八大基礎(chǔ)類以及String類型,Class類型
 * @param params
 */
@DisplayName("參數(shù)化測試,值來源")
@ParameterizedTest
@ValueSource(strings = {"a", "b", "c"})
public void parameterizedTest(String params) {
    // 會執(zhí)行3次,分別執(zhí)行a,b,c
    System.out.println(params);
    Assertions.assertTrue(StringUtils.isNotBlank(params));
}
2)@NullSource注解,null入?yún)?/h6>
/**
 * null入?yún)? *
 * @param params
 */
@DisplayName("null的入?yún)?)
@ParameterizedTest
@NullSource
public void testNull(String params) {
    Assertions.assertNull(params);
}
3)@EnumSource注解,枚舉入?yún)?/h6>
/**
 * 枚舉入?yún)?,會把枚舉遍歷一遍,分別執(zhí)行一次方法
 */
@DisplayName("枚舉的入?yún)?)
@ParameterizedTest
@EnumSource(TestEnum.class)
public void testEnumSource(TestEnum params) {
    System.out.println("state:" + params.state + ",msg:" + params.msg);
    // state:1,msg:好
    // state:2,msg:不好
    Assertions.assertNotNull(params);
}

/**
 * 枚舉類
 */
@Getter
@AllArgsConstructor
public enum TestEnum {
    GOOD(1, "好"),
    BAD(2, "不好");
    int state;
    String msg;
}
4)@CsvSource注解,多參數(shù)入?yún)?/h6>
@DisplayName("參數(shù)化測試,@CsvSource")
@ParameterizedTest
@CsvSource({"a,b,c"})
void parameterizedTestCsvSource(String a, String b, String c) {
    // 默認(rèn)使用逗號分隔
    System.out.println(a + b + c);
    Assertions.assertNotNull(a);
}

@DisplayName("參數(shù)化測試,@CsvSource2")
@ParameterizedTest
@CsvSource(value = {"a,b,c-D"}, delimiterString = "-")
void parameterizedTestCsvSource2(String abc, String d) {
    // 默認(rèn)使用逗號分隔,指定分隔符"-"
    System.out.println(abc);
    System.out.println(d);
    Assertions.assertNotNull(abc);
    // a,b,c
    // D
}
5)@CsvFileSource,參數(shù)文件入?yún)?/h6>

可以把文件中的內(nèi)容當(dāng)做參數(shù),批量來執(zhí)行,下邊附帶了my.csv和my2.csv文件內(nèi)容

注意,要在測試目錄下,新建resources目錄,再放入my.csv和my2.csv文件

/**
 * 參數(shù)文件
 *
 * @param methodName
 */
@DisplayName("參數(shù)化測試,@CsvFileSource")
@ParameterizedTest
@CsvFileSource(resources = "/my.csv")
void parameterizedTestWithCsvFileSource(String methodName) {
    // 測試目錄下,新建resources目錄
    System.out.println(methodName);
    Assertions.assertNotNull(methodName);
}

@DisplayName("參數(shù)化測試,@CsvFileSource")
@ParameterizedTest
@CsvFileSource(resources = "/my2.csv", delimiterString = "|")
void parameterizedTestWithCsvFileSource2(String name, Integer age) {
    // 測試目錄下,新建resources目錄
    System.out.println(name + ":" + age);
    Assertions.assertNotNull(name);
    // a:18
    // b:17
    // c:20
}

my.csv文件

1
2
3
4

my2.csv

a|18
b|17
c|20
6)@MethodSource注解,方法返回值入?yún)?/h6>

把一個(gè)方法的返回值,作為測試用例方法的參數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-513282.html

/**
 * 動(dòng)態(tài)參數(shù)
 */
@DisplayName("參數(shù)化測試,方法來源")
@ParameterizedTest
@MethodSource("method1") // 如果不指定方法名稱,會去找與自己相同名稱的靜態(tài)方法
public void parameterizedTestWithMethodParam(String params) {
    // MethodSource("method1") 接收這個(gè)方法的返回值,之后會執(zhí)行2次,a,b
    System.out.println(params);
    Assertions.assertNotNull(params);
}

static Stream<String> method1() {
    return Stream.of("a", "b");
}


@DisplayName("參數(shù)化測試,方法來源,多參數(shù)")
@ParameterizedTest
@MethodSource // 如果不指定方法名稱,會去找相同名稱的靜態(tài)方法
public void parameterizedTestWithMethodMultipleParams(String name, Integer age) {
    System.out.println(name + ":" + age);
    // a:18
    // b:17
    // c:20
    Assertions.assertNotNull(name);
}

static Stream<Arguments> parameterizedTestWithMethodMultipleParams() {
    return Stream.of(
            Arguments.arguments("a", 18),
            Arguments.arguments("b", 17),
            Arguments.arguments("c", 20)
    );
}

7) @ArgumentsSource注解,自定義參數(shù)入?yún)?/h6>
/**
 * 實(shí)現(xiàn)ArgumentsProvider接口,并在測試方法上使用@ArgumentsSource注解。
 */
@DisplayName("@ArgumentsSource注解")
@ParameterizedTest
@ArgumentsSource(MyArgumentsProvider.class)
public void testArgumentsSource(String name, int age) {
    System.out.println(name + ":" + age);
    // aa:18
    // bb:20
    // cc:30
    Assertions.assertNotNull(name);
}

到了這里,關(guān)于spring boot 單元測試JUnit5使用斷言Assertions和假定Assumptions、嵌套、參數(shù)測試的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Cloud中Controller單元測試 Junit5 & MockMvc

    在Spring Cloud中進(jìn)行Controller的單元測試,使用Junit5和Mock。 Controller: 方式一:使用@SpringBootTest + @AutoConfigureMockMvc 方式二:使用@WebMvcTest + @ImportAutoConfiguration(RefreshAutoConfiguration.class) 解決 No Scope registered for scope name \\\'refresh\\\' 異常 注入Mockmvc方式有兩種 方式一:(@AutoConfigureMockMvc / @

    2024年02月16日
    瀏覽(21)
  • SpringBoot單元測試斷言 assertions

    SpringBoot單元測試斷言 assertions

    斷言(assertions)是測試方法中的核心部分,用來對測試需要滿足的條件進(jìn)行驗(yàn)證。這些斷言方法都是 org.junit.jupiter.api.Assertions 的靜態(tài)方法。JUnit 5 內(nèi)置的斷言可以分成如下幾個(gè)類別: 1、簡單斷言 2、數(shù)組斷言 通過 assertArrayEquals 方法來判斷兩個(gè)對象或原始類型的數(shù)組是否相等

    2024年02月05日
    瀏覽(31)
  • 【單元測試】如何使用 JUnit5 框架?

    【單元測試】如何使用 JUnit5 框架?

    ??Junit5是一個(gè)用于在Java平臺上進(jìn)行單元測試的框架。JUnit 5 框架主要由三部分組成:JUnit Platform、JUnit Jupiter 和 JUnit Vintage。 JUnit Platform:定義了測試引擎的 API,是 JVM 上用于啟動(dòng)測試框架的基礎(chǔ)服務(wù),支持通過 IDE、構(gòu)建工具、命令行等方式運(yùn)行單元測試。 JUnit Jupiter:包含

    2024年04月10日
    瀏覽(27)
  • SpringBoot單元測試--Mockito+Junit5框架使用

    SpringBoot單元測試--Mockito+Junit5框架使用

    作為程序員為了提前發(fā)現(xiàn)代碼bug,優(yōu)化代碼; 通常我們寫完某個(gè)功能模塊代碼后都需要寫單元測試對代碼塊進(jìn)行測試(特別是敏捷開發(fā)中);Java項(xiàng)目最常用的單元測試框架即為Junit(目前最新版本為Junit5),SpringBoot本身也整合了該框架。在寫單元測試時(shí)代碼塊中的調(diào)到第三方接口方

    2024年02月02日
    瀏覽(23)
  • 在 Java 中使用JUnit5進(jìn)行單元測試和自動(dòng)化測試

    單元測試和自動(dòng)化測試是現(xiàn)代軟件開發(fā)過程中必不可少的環(huán)節(jié),可以提高代碼質(zhì)量和開發(fā)效率。JUnit5是Java中流行的單元測試框架,本文將介紹如何在Java中使用JUnit5進(jìn)行單元測試和自動(dòng)化測試。 2.1 單元測試的基本概念和原理 單元測試是一種測試方法,用于對軟件系統(tǒng)中的最

    2024年02月03日
    瀏覽(23)
  • 如何在 Java 中使用JUnit5進(jìn)行單元測試和自動(dòng)化測試

    單元測試和自動(dòng)化測試是現(xiàn)代軟件開發(fā)過程中必不可少的環(huán)節(jié),可以提高代碼質(zhì)量和開發(fā)效率。JUnit5是Java中流行的單元測試框架,本文將介紹如何在Java中使用JUnit5進(jìn)行單元測試和自動(dòng)化測試。 單元測試是一種測試方法,用于對軟件系統(tǒng)中的最小可測試單元進(jìn)行測試。這些單

    2024年02月05日
    瀏覽(26)
  • Spring Boot使用JUnit和Mockito進(jìn)行Service層單元測試

    ??在平時(shí)的開發(fā)當(dāng)中,一個(gè)項(xiàng)目往往包含了大量的方法,可能有成千上萬個(gè)。如何去保證這些方法產(chǎn)生的結(jié)果是我們想要的呢?那么在SpringBoot項(xiàng)目中我們是如何對Service層的方法進(jìn)行測試的呢? ??單元測試是一種軟件測試方法,用于測試代碼的最小可測試單元。在Java開發(fā)

    2024年02月03日
    瀏覽(23)
  • 單元測試框架——Junit5

    單元測試框架——Junit5

    Junit是一個(gè)開源的用于Java語言的單元測試框架,也是Java方向使用最廣泛的單元測試框架。 在pom.xml中引入Junit5相關(guān)依賴 @Test :表示一個(gè)方法/用例 BeforeEach :表示被注解的方法在其它所有方法執(zhí)行前都要執(zhí)行一遍,也就是說其它方法有3個(gè)它就要執(zhí)行3遍 @BeforeAll :表示被注解的

    2024年02月11日
    瀏覽(25)
  • springboot項(xiàng)目使用Junit5 + mockito + jacoco 實(shí)現(xiàn)單元測試以及代碼覆蓋率檢查

    在創(chuàng)建springboot項(xiàng)目時(shí)會默認(rèn)添加spring-boot-starter-test依賴,其中已經(jīng)包含了junit、mockito依賴,根據(jù)springboot版本的不同junit和mockito的版本也會有所不同 先說一下各自功能: junit只說一點(diǎn),junt4和junit5的注解不同,使用方式略有差異,其他不贅述了,基本用法都懂。 mockito是mock的

    2023年04月23日
    瀏覽(33)
  • Junit5單元測試框架詳解

    Junit5單元測試框架詳解

    前面我們學(xué)習(xí)了Selenium自動(dòng)化測試框架,但是有的時(shí)候測試用例會很多,我們需要一個(gè)工具來管理這些測試用例,而Junit就是一個(gè)很好的管理工具,簡單點(diǎn)來說,Junit就是一個(gè)針對Java的單元測試框架; 目錄 一.?關(guān)于Junit5 二. Junit使用 2.1 添加Maven依賴 2.2 注解 2.3 斷言 2.4 套件

    2024年02月06日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包