Kotlin类实例声明不正确

我正在将一个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类。

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); 

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

从“Kotlin in Action”引用:

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

如果你想通过测试用例而不修改它,你可以重写你的数据类的equals()来检查引用是否相等 。

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

请注意,如果有任何依赖数据类的结构相同的函数,它可能会影响其他代码。 所以,我建议你引用@ shawn的答案来改变你的测试用例。