JUnit5中@ParameterizedTest 處理 @CvsSource中的空值

翻譯:叩丁狼教育吳嘉俊

在JUnit4中測試方法參數(shù)是非常麻煩的事情(注:針對同一個方法,測試多組不同的參數(shù)值)。JUnit5中引入了大量的新的特性,讓使用同一個測試方法,測試不同的參數(shù)變得非常容易。但是,這里面有一個問題值得討論,就是測試空值的問題。

在這篇文章中,我們會討論在JUnit5中,如何通過@CvsSource@ValueSource@ParameterizedTest測試傳入一個空值。

@CvsSource中的空值

我們通過一個例子來引入這個問題。

假設(shè),我們已經(jīng)創(chuàng)建了一個類,名字叫做DateRange,這個類包含兩個日期參數(shù),用來表示一段時間。你可以通過調(diào)用DateRange的構(gòu)造方法,傳入至少一個日期對象,來創(chuàng)建一個DateRange對象。我們在構(gòu)造方法中也會檢查,開始時間必須在結(jié)束時間之前。

使用Junit5提供的@ParametrizedTest我們可以非常方便的進行DateRange構(gòu)造器的測試:

@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));
}

當你運行這個測試,可能會得到類似如下的異常提示:

org.junit.jupiter.api.extension.ParameterResolutionException: Error converting parameter at index 0: Failed to convert String “null” to type java.time.LocalDate

這是因為,雖然JUnit5中提供了多種內(nèi)置的類型轉(zhuǎn)換器用于將@CvsSource或者@ValueSource中的字符串轉(zhuǎn)換成不同類型,但是null值是不能轉(zhuǎn)化成空值的,仍然只能作為一個null字符串存在。

那我們就不能在Junit5中使用空值測試了?

自定義Null轉(zhuǎn)換器

幸運的是,Junit5提供了非常靈活和方便的擴展方式。

默認情況下,框架使用DefaultArgumentConverter類將String轉(zhuǎn)化為其他類型。我們的目標就是把@CvsSource中的null字符串變成null值,其他的字符串仍然使用默認的轉(zhuǎn)化器執(zhí)行轉(zhuǎn)化。

為了達到這個目標,我們需要繼承SimpleArgumentConverter并實現(xiàn)抽象方法convert()方法,在該方法中,我們檢查null字符串,如果發(fā)現(xiàn)是null字符串,返回null值,其他的繼續(xù)交給默認轉(zhuǎn)化器:

import org.junit.jupiter.params.converter.DefaultArgumentConverter;

public final class NullableConverter extends SimpleArgumentConverter {
   @Override
   protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
       if ("null".equals(source)) {
           return null;
       }
       return DefaultArgumentConverter.INSTANCE.convert(source, targetType);
   }
}

注意,其中的DefaultArgumentConverter.INSTANCE.convert()方法是從JUnit5.2版本開始的。

使用Null轉(zhuǎn)換器

一旦我們的轉(zhuǎn)換器做好,我們就可以在測試中使用@ConvertWith注解來標記我們的測試參數(shù):

@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);
}

到這里,你應(yīng)該已經(jīng)知道如何在Junit5的參數(shù)測試中接受null值了。舉一反三,類似的特殊的轉(zhuǎn)換,也可以輕易實現(xiàn)。

原文:https://www.javacodegeeks.com/2018/10/parameterizedtest-null-values-cvssource.html

想獲取更多技術(shù)視頻,請前往叩丁狼官網(wǎng):http://www.wolfcode.cn/openClassWeb_listDetail.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容