Kotlin类实例断言不正确

时间:2017-08-15 05:49:14

标签: 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类。

2 个答案:

答案 0 :(得分:1)

isNotEqualTo来电equals。 Kotlin类为equals实现了正确的data class方法。所以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);

答案 1 :(得分:1)

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

来自" Kotlin in Action":

  

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

如果您想通过测试用例而不进行修改,可以覆盖数据类的override fun equals(other: Any?) = this === other 以检查referential equality

[ 'a', 'b' ]

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