首页 > 解决方案 > 在 Kotlin 中测试非空参数

问题描述

这里是 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 中那样工作感到很困惑。任何想法?

感谢您抽出宝贵的时间!

标签: javakotlinnullpointerexceptionnullablenon-nullable

解决方案


首先,在您的示例中使用@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,正如评论中所建议的那样。


推荐阅读