【问题标题】:Kotlin class instance assert not correctKotlin 类实例断言不正确
【发布时间】:2017-08-15 14:45:53
【问题描述】:

我正在将一个 Java 项目转换为 Kotlin。我已将 User 对象转换为 Kotlin,当我在 Java 中运行现有的 JUnit 测试时,我在 Kotlin User 对象的两个实例之间遇到错误。

User.kt:

data class User (
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
var id: Long? = null,
...
)

TestUtil.java

import static org.assertj.core.api.Assertions.assertThat;

public class TestUtil {
    public static void equalsVerifier(Class clazz) throws Exception {
        Object domainObject1 = clazz.getConstructor().newInstance();
        // Test with an instance of the same class
        Object domainObject2 = clazz.getConstructor().newInstance();
        assertThat(domainObject1).isNotEqualTo(domainObject2);
    }
}

assertThat(domainObject1).isNotEqualTo(domainObject2) 测试失败,因为我相信 Java 比较在 Kotlin 类上没有正确完成。如果我通过调试器运行它,我可以看到 domainObject1domainObject2 是不同的实例。

这个测试用例有可能通过吗?相同的测试用例用于其他 Java 类,因此它必须同时适用于 Java 和 Kotlin 类。

【问题讨论】:

  • 如果你删除了data 关键字,失败的测试将通过,这是因为 Kotlin data class 将生成 equals 方法来与主构造函数中的属性进行比较。

标签: kotlin


【解决方案1】:

isNotEqualTo 调用 equals。 Kotlin 类为data class 实现了正确的equals 方法。所以domainObject1.equals(domainObject2) 是真的。这种行为是正确的。

只看 AssertJ 文档:

isNotSameAs(Object other): 
   Verifies that the actual value is not the same as the given one, 
   ie using == comparison.

我觉得你应该试试:

    assertThat(domainObject1).isNotSameAs(domainObject2);

【讨论】:

    【解决方案2】:

    在 Kotlin 中,equals() 会自动为 data class 生成以检查属性是否相等。

    引自“Kotlin in Action”:

    生成的 equals() 方法检查所有属性的值是否相等。 ...请注意,未在主构造函数中声明的属性不参与相等性检查和哈希码计算。

    如果您想通过测试用例而不修改它,您可以覆盖数据类的equals() 以检查referential equality

    override fun equals(other: Any?) = this === other
    

    请注意,如果有任何函数依赖于您的数据类的structural equality,它可能会影响您的其他代码。所以,我建议您参考@shawn 的回答来更改您的测试用例。

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多