【问题标题】:Testing a non-null parameter in Kotlin在 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 中。

标签: java kotlin nullpointerexception nullable non-nullable


【解决方案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 中所建议的那样。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2019-11-19
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多