在 Kotlin 中测试非空参数

Posted

技术标签:

【中文标题】在 Kotlin 中测试非空参数【英文标题】:Testing a non-null parameter in Kotlin 【发布时间】:2020-01-21 15:11:34 【问题描述】:

这里是 Kotlin 新手!

我刚刚将一些 Java 测试代码转换为 Kotlin,而空代码的特定情况目前正在困扰着我。我正在尝试测试(在 Kotlin @Test 代码段中)这个 java 函数是否引发了正确的 InvalidParameterException

void addEventListener(
            @NonNull DeviceEventListener listener,
            @Nullable CompletionListener completionListener);

所以这个函数是通过 Kotlin 代码(在从 java 转换为 kotlin 之前运行良好)调用的,如下所示: 在 Java 之前:

deviceTest.addEventListener(null, testCompletionListener);
waiter.expect(InvalidParameterException.class);

测试运行良好,没有错误。

转换到 Kotlin 后,代码变得无法访问或引发 KotlinNullPointerException

deviceTest!!.addEventListener(null!!, testCompletionListener)
waiter!!.expect(InvalidParameterException::class.java)

我是 Kotlin 的新手,对如何让它像以前在 Java 中那样工作感到很困惑。 有什么想法吗?

感谢您抽出宝贵时间!

【问题讨论】:

为什么要将空参数传递给不可为空的字段?另外,!! 如果在 null 上调用它会抛出一个空指针异常。 一个精度,我无法更改void addEventListener的java代码,只能在测试代码中调用它的方式。 @PeterK 我正在传递一个空参数来测试和验证是否引发了正确的 invalidParameterException。 !! 是由 java 自动放入 kotlin 转换器 如果您不能更改界面,这很公平,但这不是我的意思。 Kotlin 将阻止您将 null 作为参数传递给非 null 字段。 是的,但是 java 和 kotlin 之间的主要区别之一是 kotlin 具有可空和不可空类型,并且当代码需要不可空类型时,您不能传递可空类型。它将强制您将值转换为不可为空的。最简单(也是最脏)的方法是使用!!,如果值为空,它将抛出一个空指针。如果你需要测试这个特定的场景,也许你应该把这个类保留在 java 中。 【参考方案1】:

首先,在您的示例中,您使用了 @NonNull,但我假设您的意思是 @NotNull,因为这是 Kotlin 使用的正确注释。

其次,我假设您采用在 Kotlin 中编写测试的方法,但仍然在 Java 代码中使用这些函数。否则,如果您的代码库仅在 Kotlin 中,则此测试毫无意义。

第三,如果您尝试将null 分配给@NotNull 参数,您应该收到IllegalArgumentException,而不是InvalidParameterException

最后,你可以利用平台类型来模拟这种情况:

// This should be a Java class
public class Nulls 
    public static final DeviceEventListener NULL_DEVICE_EVENT_LISTENER = null;


// In Kotlin
deviceTest.addEventListener(Nulls.NULL_DEVICE_EVENT_LISTENER, testCompletionListener)

但是由于Nulls 无论如何都是一个Java 类,您最好将整个测试保留为Java,正如cmets 中所建议的那样。

【讨论】:

以上是关于在 Kotlin 中测试非空参数的主要内容,如果未能解决你的问题,请参考以下文章

如何调用从 Kotlin 获取非空 Void 参数的 Java 方法?

java.lang.IllegalArgumentException:指定为非空的参数为空:方法 kotlin.jvm.internal.Intrinsics.checkParameterIsNotN

Kotlin - 可空字段的非空 getter

用 Kotlin 编写的 Android 库,提供对 Java 应用程序的支持

用 Kotlin 编写的 Android 库,提供对 Java 应用程序的支持

希望对Android应用中的Kotlin非空断言错误进行解释。