@ParameterizedTest在@CvsSource中具有空值
在JUnit 4中編寫參數(shù)化測試非常麻煩。 JUnit 5對框架進行了一些有用的改進,并且使用不同的參數(shù)運行相同的測試比以前的版本要簡單得多。 但是,在這樣的參數(shù)中傳遞空值存在一個小問題。
在這篇文章中,我將向您展示如何在JUnit 5中的@ParametrziedTest的@CvsSource和@ValueSource中傳遞null 。
1. @CsvSource中的空值
為了分析問題,我們需要一個示例案例。
假設(shè)我們創(chuàng)建了一個名為DateRange的類,其中包含一個時間段的兩個邊界日期。 僅當您將至少一個邊界日期傳遞給構(gòu)造函數(shù)時,才能創(chuàng)建新對象。 我們還需要確保開始日期早于結(jié)束日期。
使用JUnit 5中的@ParametrizedTest ,我們可以通過以下兩個測試來描述給定的需求。
@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)); }但是,當您嘗試執(zhí)行這些測試時,最終將出現(xiàn)類似于以下所示的錯誤。
org.junit.jupiter.api.extension.ParameterResolutionException:轉(zhuǎn)換索引0處的參數(shù)時出錯:無法將字符串“ null”轉(zhuǎn)換為java.time.LocalDate類型
盡管JUnit 5附帶了許多內(nèi)置的轉(zhuǎn)換器,從字符串值到不同類型, 但是 @ValueSource或 @CsvSource中 不接受空值 。
那么,如何強制JUnit 5使用空文字呢?
2.自定義可為空的參數(shù)轉(zhuǎn)換器
幸運的是,JUnit 5具有靈活性,我們可以輕松擴展其功能。
默認情況下,框架使用DefaultArgumentConverter類將String轉(zhuǎn)換為其他類型。 我們的目標是將字符串“ null”表示為空文字。 其他字符串值應(yīng)使用默認轉(zhuǎn)換器進行轉(zhuǎn)換。
為此,我們創(chuàng)建一個擴展SimpleArgumentConverter的類并實現(xiàn)其抽象的convert()方法。 在主體中,我們檢查“空”值。 在其他情況下,我們執(zhí)行默認轉(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);} }請注意, 自JUnit 5.2起,上面提供 的 DefaultArgumentConverter.convert() 的簽名 就可用。
3.使用自定義參數(shù)轉(zhuǎn)換器
準備好自定義轉(zhuǎn)換器后,我們可以在測試中使用@ConvertWith批注對其進行調(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ù)源中接受空值以進行參數(shù)化測試。 我希望這種轉(zhuǎn)換在框架的將來版本中將是自動的。 目前,我們需要一個小的解決方法。
如有任何疑問,請保留在評論中。 如果您想了解最新帖子,請關(guān)注我或加入訂閱列表。
翻譯自: https://www.javacodegeeks.com/2018/10/parameterizedtest-null-values-cvssource.html
總結(jié)
以上是生活随笔為你收集整理的@ParameterizedTest在@CvsSource中具有空值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 悄悄关注怎么设置(悄悄关注怎么设置手机)
- 下一篇: 使用Google Cloud Stora