Kotlin 在不可为空的字段中进行试驾的最佳方法

Kotlin 在不可为空的字段中进行试驾的最佳方法,kotlin,nullable,Kotlin,Nullable,我有一个像这样的kotlin物体 data class Car( val id: UUID ) 由于kotlin编译时检查,该id不可为空。我只是想确保将来,如果有人将线路更改为 val id: UUID? 因为该字段可为空将使依赖于id(save/get/etc)的多个服务陷入混乱。 我在想,我可以用一个可空id创建另一个类似汽车的类,并为我的服务编写测试,以确保它们能够处理空id,但这并不是非常容易,而且似乎是错误的 我的另一个选择似乎是在测试中访问id的实例方法,如下所示

我有一个像这样的kotlin物体

data class Car(
    val id: UUID
)
由于kotlin编译时检查,该id不可为空。我只是想确保将来,如果有人将线路更改为

   val id: UUID?
因为该字段可为空将使依赖于id(save/get/etc)的多个服务陷入混乱。 我在想,我可以用一个可空id创建另一个类似汽车的类,并为我的服务编写测试,以确保它们能够处理空id,但这并不是非常容易,而且似乎是错误的

我的另一个选择似乎是在测试中访问id的实例方法,如下所示

@Test
fun `dont change Car.id to nullable`(){
   Car().id.timestamp() // calling timestamp() will no longer compile if someone changes UUID to UUID?
} 
但这似乎令人困惑

我看着测试,好像它们保护代码一样。因此,如果有人进来,他们应该能够改变任何他们想要的,只要他们不破坏任何现有的测试,他们就可以确信他们没有破坏任何现有的功能。

但是我不知道如何阻止某人将“UUID”更改为“UUID?”,这将引入一个巨大的错误

如果您可以使用反射,那么您可以这样做:

assertFalse(Car::id.returnType.isMarkedNullable)

如果您同意使用反射,则可以执行以下操作:

assertFalse(Car::id.returnType.isMarkedNullable)

这可能已经足够好了:

data class Car(
    // NOTE: Absolutely don't change this to 'UUID?' !!
    val id: UUID
)

忽略该注释的人就是那些只会删除或取消注释您为维护该规则而编写的任何自动测试的人。

这可能足够好了:

data class Car(
    // NOTE: Absolutely don't change this to 'UUID?' !!
    val id: UUID
)

忽略该注释的人就是那些只会删除或取消注释您为支持该规则而编写的任何自动测试的人。

为了确保构造函数或方法参数没有可为null的类型,您应该将null传递给该方法,并检查它是否抛出
IllegalArgumentException
。您可以通过两种方式完成:

  • 从Java调用:
    newcar(null)
  • 从Kotlin调用它并传递平台类型的变量
    Car(getNull())
  • getNull()
    应在Java中定义:

    public static <T> T getNull() {
        return null;
    }
    
    publicstatict getNull(){
    返回null;
    }
    
    要确保构造函数或方法参数没有可为null的类型,您应该将null传递给此方法,并检查它是否抛出
    IllegalArgumentException
    。您可以通过两种方式完成:

  • 从Java调用:
    newcar(null)
  • 从Kotlin调用它并传递平台类型的变量
    Car(getNull())
  • getNull()
    应在Java中定义:

    public static <T> T getNull() {
        return null;
    }
    
    publicstatict getNull(){
    返回null;
    }
    
    很抱歉,我不同意,过去几年与我共事的大多数程序员都将注释视为记录代码的旧方法,将测试视为记录代码的新方法。对他们来说,删除一个具有良好描述性名称且意图明确的测试比删除注释或忽略注释更糟糕。对不起,我不同意,过去几年与我共事的大多数程序员将注释视为记录代码的旧方法,将测试视为记录代码的新方法。对他们来说,删除一个具有良好描述性名称且意图明确的测试比删除注释或忽略注释更糟糕。