java.lang.AssertionError 和两个实体是否相同?什么可能导致这种情况?

发布于 2024-12-29 17:01:10 字数 4437 浏览 0 评论 0原文

使用 Assert.AssertEquals() 方法测试 DAO 时出现以下错误:

java.lang.AssertionError: expected: com.develop.test.data.entity.Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5> but was: com.develop.test.data.entity.Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5>
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.failNotEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:126)
at org.junit.Assert.assertEquals(Assert.java:145)
at com.develop.test.data.dao.RpointDAOTest.testFindById(RpointDAOTest.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:199)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

这是代码片段:

@Test
@Transactional(isolation = Isolation.SERIALIZABLE)
public void testFindById(){
    Category newCategory = new Category("C", "Recognize a Co-Worker", true);

    Rpoint newRPoint = new Rpoint.Builder()
                .id(3)
                .category(newCategory)                    
                .description("Maximize Resources")
                .points(50)
                .active(true)
                .build();

    Assert.assertEquals(newRPoint, this.RpointDao.findById(3));
}

我一直在使用调试,并且两个实体具有相同的数据。这可能是由实体中的 equals/HashCode 实现引起的吗?

编辑:添加等于和哈希码:

@Override
public boolean equals(Object instance) {
    if (instance == null)
        return false;

    if (!(instance instanceof Rpoint))
        return false;

    Rpoint o = (Rpoint) instance;
    return new EqualsBuilder().append(this.getId(), o.getId()).
            append(this.getCategory(), o.getCategory()).
            append(this.getDescription(), o.getDescription()).
            append(this.getPoints(), o.getPoints()).
            append(this.getActive(), o.getActive()).
            isEquals();
}

@Override
public int hashCode() {
    return new HashCodeBuilder(23, 25).append(this.getId()).
            append(this.getCategory()).
            append(this.getDescription()).
            append(this.getPoints()).
            append(this.getActive()).
            toHashCode();
}

I am getting the following error when testing my DAO using Assert.AssertEquals() method:

java.lang.AssertionError: expected: com.develop.test.data.entity.Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5> but was: com.develop.test.data.entity.Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5>
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.failNotEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:126)
at org.junit.Assert.assertEquals(Assert.java:145)
at com.develop.test.data.dao.RpointDAOTest.testFindById(RpointDAOTest.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:199)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Here's the snippet:

@Test
@Transactional(isolation = Isolation.SERIALIZABLE)
public void testFindById(){
    Category newCategory = new Category("C", "Recognize a Co-Worker", true);

    Rpoint newRPoint = new Rpoint.Builder()
                .id(3)
                .category(newCategory)                    
                .description("Maximize Resources")
                .points(50)
                .active(true)
                .build();

    Assert.assertEquals(newRPoint, this.RpointDao.findById(3));
}

I've been using debug, and both entities have the same data. Could this be caused by the equals/HashCode implementation in the entity?

Edit: added equals and hashcode:

@Override
public boolean equals(Object instance) {
    if (instance == null)
        return false;

    if (!(instance instanceof Rpoint))
        return false;

    Rpoint o = (Rpoint) instance;
    return new EqualsBuilder().append(this.getId(), o.getId()).
            append(this.getCategory(), o.getCategory()).
            append(this.getDescription(), o.getDescription()).
            append(this.getPoints(), o.getPoints()).
            append(this.getActive(), o.getActive()).
            isEquals();
}

@Override
public int hashCode() {
    return new HashCodeBuilder(23, 25).append(this.getId()).
            append(this.getCategory()).
            append(this.getDescription()).
            append(this.getPoints()).
            append(this.getActive()).
            toHashCode();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

Spring初心 2025-01-05 17:01:10

是的,如果 equals 实现得不好,即使使用相同的引用也会返回 false,这肯定会导致失败。请注意,这不仅仅是对象内的数据相同的情况,而且诊断表明两侧都是同一个对象:

expected [...].Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5>
but was: [...].Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5>

7668e5b5 不应该真正被视为对象标识,但它在这里极具暗示性......

请显示您正在使用的 equals 方法。

Yes, if equals is implemented badly so that it returns false even if you use the same reference, this would definitely cause the failure. Note that it's not just a case of the data within the object being the same, but the diagnostics suggest it's the same object on both sides:

expected [...].Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5>
but was: [...].Rpoint<com.develop.test.data.entity.Rpoint@7668e5b5>

The 7668e5b5 shouldn't really be treated as object identity, but it's extremely suggestive here...

Please show the equals method you're using.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文