首页 > 解决方案 > 在 Kotlin 中使用 check 验证字符串失败

问题描述

我有一个应用程序,用户必须输入不同的字符串。根据应用程序中字符串的性质,它必须遵循一些规则,例如,如果它是一个名称,则它必须以字母开头。

我写了一个规则来确保一个字符串是有效的,在一个必须以字母开头的字符串的情况下,我写了以下规则:

fun String.isFirstCharALetter(): Boolean = this[0].isLetter()

函数扩展检查适用于特定字符串的所有规则:

fun String.validateName(): String {
    check(this.isFirstCharALetter()) { "The first character of a name can only be a letter" }
    //... other checks
    return this
}

仅当字符串有效时,我才使用此函数扩展来实例化 a Name(至少这是我的意图):

data class Name(val value: String) {
    companion object {
        operator fun invoke(strg: String) {
            Name(value= strg.validate())
        }
    }
}

我写了以下单元测试:

@Test
fun test_assert_name() {
    assertFailsWith<IllegalStateException> { Name("8foo") }
}

由于8foo不是以字母开头的,所以我希望用这个字符串实例化IllegalStateExceptiona 时会引发异常,所以上面的测试必须成功。Name

但测试失败并显示以下消息:

java.lang.AssertionError: Expected an exception of class java.lang.IllegalStateException to be thrown, but was completed successfully.

有谁看到我在哪里做错了?

标签: androidunit-testingtestingexceptionkotlin

解决方案


要运行调用运算符,您需要调用

val name = Name("8foo")
name("8foo")

然后调用将被异常调用

也许您应该检查 init{} 部分的第一个字母?

class Name(private val string:String) {

    init{
        check(false){"Error"}
    }

您还可以使用正则表达式检查字符串是否以字母开头


推荐阅读