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