如何为 isNullOrEmpty() 函数编写单元测试

时间:2021-07-20 15:46:39

标签: kotlin

我有一个验证请求的函数,它不能为空或为空,我可以测试端点是否为空,但我不能将值作为空传递给测试中的请求,我会得到“NullPointerException”,我如何测试空情况?

fun validateRequest(request: RegisteRequest) {
              validateEndPoint(request.EendPoint)
    }


private fun validateEndPoint(endPoint: String) {
        if (endPoint.isNullOrEmpty()) {
            logger.error("Request is missing EndPoint")
            throw IllegalArgumentException(ERROR_MESSAGE_MISSING_END_POINT)
        }
    }

1 个答案:

答案 0 :(得分:1)

Kotlin 的类型系统能够区分可以为 null 的值(例如 String?)和不能为 null 的值(例如 String)。您可以找到更多详情here

在您的情况下,您正在定义一个接受非空字符串输入的函数,因此如果您从 Kotlin 调用它,Kotlin 编译器将确保您不传递 null 值– 如果您尝试这样做,它将导致构建失败。

如果您仍然设法传递 null 值(例如,通过反射或从 Java 调用函数),您将获得 NullPointerException(如记录的 here) ,因为 Kotlin 编译器实际上会在幕后插入一些指令以确保您不提供 null 值。

因此,如果您的代码打算从 Java 调用,或者如果您真的想测试通过 null 会发生什么,您必须断言 NullPointerException 被抛出。

如果 null 是一个有效值并且您想以不同的方式处理它,则必须更改方法的签名,以便它接受 null 参数(注意类型这里的参数是 String?):

private fun validateEndPoint(endPoint: String?) {
    ...
}