如何测试Kotlin中无参数的日期解析String扩展函数?
Kotlin 日期转换无参扩展函数测试方法
首先明确:你当前给出的stringToDate()实现仅支持解析匹配MMMM d yyyy格式的字符串,传入不符合该格式的内容时会直接返回null,本身没有自动适配其他日期格式的逻辑,测试可以按以下三类场景覆盖:
核心合法场景测试
测试前必须先固定解析用的语言环境和时区——SimpleDateFormat默认依赖设备当前的Locale和时区,不固定的话同一条用例在中文环境、英文环境,或者不同时区的设备上会出现完全不同的结果,直接导致测试不稳定。
你可以在测试类里提前初始化和函数逻辑对齐的格式化实例作为基准,构造符合格式的输入后,对比扩展函数返回值和基准解析结果是否一致即可,参考代码(基于JUnit):
import org.junit.Test import java.text.SimpleDateFormat import java.util.* import kotlin.test.assertEquals import kotlin.test.assertNull class DateExtensionTest { // 固定测试用的语言环境、时区,避免环境差异导致用例失败 private val testLocale = Locale.US private val testTimeZone = TimeZone.getTimeZone("UTC") private val referenceFormat = SimpleDateFormat(Constant.DATE_FORMAT, testLocale).apply { timeZone = testTimeZone isLenient = false // 关闭宽松解析,避免非法日期被自动转成合法值 } @Test fun `输入符合标准格式的日期字符串,返回对应正确Date对象`() { val testCases = listOf( "January 1 2024", "December 31 2023", "October 1 2024" ) testCases.forEach { case -> val expected = referenceFormat.parse(case) assertEquals(expected, case.stringToDate()) } } }
非法输入场景测试
覆盖所有不符合格式要求的输入,校验函数返回null即可,需要覆盖的典型场景:
- 其他常见日期格式字符串:比如
2024-10-01、01/10/2024、1 Oct 2024 - 非日期内容:随机字符串、空字符串、纯数字字符串
- 逻辑不存在的日期:比如
February 30 2024、January 32 2024
对应测试代码:
@Test fun `输入不符合格式的内容,返回null`() { val invalidCases = listOf( "2024-10-01", "01/10/2024", "1 Oct 2024", "abcdefg", "", "123456", "February 30 2024" ) invalidCases.forEach { case -> assertNull(case.stringToDate()) } }
边界场景测试
覆盖格式规则内的边界输入,确认解析逻辑正常:
- 个位数日期、两位数日期:因为格式占位符是
d(而非补零的dd),需要验证March 5 2024、March 15 2024两类输入都能正常解析 - 跨月、跨年临界日期:比如每月1号、每月最后一天、12月31日、1月1日这类特殊节点
补充说明:如果你预期这个函数要支持自动识别转换其他格式的日期字符串,当前给出的实现是不满足需求的,需要在函数内部增加多格式轮询解析的逻辑,对应测试还要补充所有你要支持的日期格式的合法输入校验用例。
内容的提问来源于stack exchange,提问作者mahmoud deif
相关产品推荐
相关产品推荐

