首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin类实例断言不正确

Kotlin类实例断言不正确
EN

Stack Overflow用户
提问于 2017-08-15 05:49:13
回答 2查看 2.1K关注 0票数 1

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

User.kt:

代码语言:javascript
复制
data class User (
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
var id: Long? = null,
...
)

TestUtil.java

代码语言:javascript
复制
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)测试失败了,因为我相信比较在Kotlin类上做得不正确。如果我通过调试器运行它,我可以看到domainObject1domainObject2是不同的实例。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-15 06:15:47

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

只需查看AssertJ文档:

代码语言:javascript
复制
isNotSameAs(Object other): 
   Verifies that the actual value is not the same as the given one, 
   ie using == comparison.

我觉得你应该试试:

代码语言:javascript
复制
    assertThat(domainObject1).isNotSameAs(domainObject2);
票数 1
EN

Stack Overflow用户

发布于 2017-08-15 06:38:46

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

引用"Kotlin in Action":

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

如果希望在不修改测试用例的情况下通过测试用例,则可以重写数据类的equals()以检查是否存在参考平等

代码语言:javascript
复制
override fun equals(other: Any?) = this === other

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45687125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档