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类上没有正确完成。 如果我通过调试器运行这个,我可以看到domainObject1
和domainObject2
是不同的实例。
是否有可能通过这个测试案例? 其他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的答案来改变你的测试用例。