日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

@ParameterizedTest在@CvsSource中具有空值

發(fā)布時(shí)間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @ParameterizedTest在@CvsSource中具有空值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在JUnit 4中編寫參數(shù)化測試非常麻煩。 JUnit 5對(duì)框架進(jìn)行了一些有用的改進(jìn),并且使用不同的參數(shù)運(yùn)行相同的測試比以前的版本要簡單得多。 但是,在這樣的參數(shù)中傳遞空值存在一個(gè)小問題。

在這篇文章中,我將向您展示如何在JUnit 5中的@ParametrziedTest的@CvsSource和@ValueSource中傳遞null 。

1. @CsvSource中的空值

為了分析問題,我們需要一個(gè)示例案例。

假設(shè)我們創(chuàng)建了一個(gè)名為DateRange的類,其中包含一個(gè)時(shí)間段的兩個(gè)邊界日期。 僅當(dāng)您將至少一個(gè)邊界日期傳遞給構(gòu)造函數(shù)時(shí),才能創(chuàng)建新對(duì)象。 我們還需要確保開始日期早于結(jié)束日期。

使用JUnit 5中的@ParametrizedTest ,我們可以通過以下兩個(gè)測試來描述給定的需求。

@ParameterizedTest @CsvSource({"2017-06-01, 2018-10-15","null, 2018-10-15","2017-06-01, null" }) void shouldCreateValidDateRange(LocalDate startDate, LocalDate endDate) {new DateRange(startDate, endDate); }@ParameterizedTest @CsvSource({"2018-10-15, 2017-06-01","null, null" }) void shouldNotCreateInvalidDateRange(LocalDate startDate, LocalDate endDate) {assertThrows(IllegalArgumentException.class, () -> new DateRange(startDate, endDate)); }

但是,當(dāng)您嘗試執(zhí)行這些測試時(shí),最終將出現(xiàn)類似于以下所示的錯(cuò)誤。

org.junit.jupiter.api.extension.ParameterResolutionException:轉(zhuǎn)換索引0處的參數(shù)時(shí)出錯(cuò):無法將字符串“ null”轉(zhuǎn)換為java.time.LocalDate類型

盡管JUnit 5附帶了許多內(nèi)置的轉(zhuǎn)換器,從字符串值到不同類型, 但是 @ValueSource或 @CsvSource中 不接受空值 。

那么,如何強(qiáng)制JUnit 5使用空文字呢?

2.自定義可為空的參數(shù)轉(zhuǎn)換器

幸運(yùn)的是,JUnit 5具有靈活性,我們可以輕松擴(kuò)展其功能。

默認(rèn)情況下,框架使用DefaultArgumentConverter類將String轉(zhuǎn)換為其他類型。 我們的目標(biāo)是將字符串“ null”表示為空文字。 其他字符串值應(yīng)使用默認(rèn)轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。

為此,我們創(chuàng)建一個(gè)擴(kuò)展SimpleArgumentConverter的類并實(shí)現(xiàn)其抽象的convert()方法。 在主體中,我們檢查“空”值。 在其他情況下,我們執(zhí)行默認(rèn)轉(zhuǎn)換器。

import org.junit.jupiter.params.converter.DefaultArgumentConverter;public final class NullableConverter extends SimpleArgumentConverter {@Overrideprotected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {if ("null".equals(source)) {return null;}return DefaultArgumentConverter.INSTANCE.convert(source, targetType);} }

請(qǐng)注意, 自JUnit 5.2起,上面提供 的 DefaultArgumentConverter.convert() 的簽名 就可用。

3.使用自定義參數(shù)轉(zhuǎn)換器

準(zhǔn)備好自定義轉(zhuǎn)換器后,我們可以在測試中使用@ConvertWith批注對(duì)其進(jìn)行調(diào)用。

@ParameterizedTest @CsvSource({"2017-06-01, 2018-10-15","null, 2018-10-15","2017-06-01, null" }) void shouldCreateValidDateRange(@ConvertWith(NullableConverter.class) LocalDate startDate,@ConvertWith(NullableConverter.class) LocalDate endDate) {new DateRange(startDate, endDate); }

結(jié)論

至此,您應(yīng)該已經(jīng)知道如何在JUnit 5參數(shù)源中接受空值以進(jìn)行參數(shù)化測試。 我希望這種轉(zhuǎn)換在框架的將來版本中將是自動(dòng)的。 目前,我們需要一個(gè)小的解決方法。

如有任何疑問,請(qǐng)保留在評(píng)論中。 如果您想了解最新帖子,請(qǐng)關(guān)注我或加入訂閱列表。

翻譯自: https://www.javacodegeeks.com/2018/10/parameterizedtest-null-values-cvssource.html

總結(jié)

以上是生活随笔為你收集整理的@ParameterizedTest在@CvsSource中具有空值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。