在 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 编写的 Android 库,提供对 Java 应用程序的支持