java - 在 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 中那样工作感到很困惑。任何想法?
感谢您抽出宝贵的时间!
解决方案
首先,在您的示例中使用@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,正如评论中所建议的那样。
推荐阅读
- javascript - 使用过滤器方法从数组中提取彼此之间具有精确间隙的数字
- anylogic - 为什么我在 AnyLogic 中得到空指针异常?
- javascript - 添加 `runValidators: true` 后,我的 Mongoose 更新函数出错,并显示 `cannot read property 'ownerDocument' of null `
- pandas - pands 通过聚合失败过滤 df
- javascript - 在原生 javascript (2020) 中的 2 个 div 之间同步滚动
- php - 使用 php 和 oracle 时值不匹配
- amazon-web-services - 如何将现有资源链接到 cloudformation 堆栈?
- c# - Dynamics365 - 单击按钮并显示弹出窗口时无法找到相应的元素
- list - 从字典列表中,创建一个字典,其中成员包含一个列表
- wordpress - Wordpress 在循环中重定向 302-307