java - 在 Kotlin 中测试非空参数

标签 java kotlin nullpointerexception nullable non-nullable

这里是 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 中那样工作。 有什么想法吗?

感谢您抽出时间!

最佳答案

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

关于java - 在 Kotlin 中测试非空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030409/

相关文章:

java - 使用 wsdl4j 解析 wsdl 以列出操作、输入/输出参数时出现空指针异常

java - jsoup 代码可以在 Java 中运行,但不能在 Android 中运行 - NullpointerException

java - 在主线程中获取空指针异常

java - 使 SimpleDateFormat.parse() 在无效日期上失败(例如,月份大于 12)

Java 移动文件

java - 自定义 Tomcat 错误页面不显示图像

android - 如何在 Java 代码中使用 Kotlin 协程实现 NIO Socket(客户端)?

java - 在不知道这种格式是什么的情况下,快速转换为 double 十进制格式字符串的方法

java - setPreferredWidth() 导致表格列显示不正确

kotlin - 模拟异常-找不到答案