【问题标题】:JUnit AssertSame fails on object.toString in groovyJUnit AssertSame 在 groovy 中的 object.toString 上失败
【发布时间】:2011-12-12 12:38:48
【问题描述】:

我正在尝试在 groovy 中测试被覆盖的 toString()(我知道这很简单,但这是您在阅读 kent beck 的 TDD 书后得到的)。 我在预期的字符串和实际的字符串上断言相同

这里是代码块:

@Test 无效 testToString(){ def study = new Study(标识符:“默认研究”,OID:“S_DEFAULTS1”,名称:“默认研究”) def 预期 = “org.foo.oc.model.bar(OID:S_DEFAULTS1,名称:默认研究,标识符:默认研究)” assertSame “应该相等”,预期,study.toString() }

这是失败测试的堆栈跟踪:

junit.framework.AssertionFailedError:应该等于预期相同:org.foo.oc.model.bar(OID:S_DEFAULTS1,名称:默认研究,标识符:默认研究)不是:org.foo.oc.model.bar( OID:S_DEFAULTS1,名称:默认研究,标识符:默认研究) 在 junit.framework.Assert.fail(Assert.java:47) 在 junit.framework.Assert.failNotSame(Assert.java:273) 在 junit.framework.Assert.assertSame(Assert.java:236)

只需添加 assertEquals 在相同的参数下效果很好。 我知道这没什么大不了,但我想了解它为什么会失败。

谢谢

【问题讨论】:

    标签: groovy junit


    【解决方案1】:

    你为什么不使用assertEquals,它使用.equals()assertSame 比较对象引用(== 运算符)。即使字符串相同,但它们是两个不同的对象,因此断言失败。

    更新:这是 Java 中一个非常常见的错误:String.equals()== 运算符的工作方式不同。这已经讨论过好几次了:

    我知道您使用的 Groovy 不会遇到这个问题,但是 JUnit 是用 Java 编写的,并且按照上述规则运行。

    更新:实际上,您的字符串 不同:

    org.foo.oc.model.bar(OID:S_DEFAULTS1,  name:Default Study, identifier:default-study)
    org.foo.oc.model.bar(OID:S_DEFAULTS1, name:Default Study, identifier:default-study)
    

    【讨论】:

    • 对字符串中的差异感到抱歉。这是一个编辑问题,而不是真正的编译器输出。 AssertEquals 对我来说效果很好,但我想了解为什么 assertSame 不起作用。我认为这种情况下的字符串是对象引用 - 请纠正我。
    • 非常感谢。你的参考对我帮助很大。在接受你的回答之前我会要求确认,我只是用 assertSame 做了一个小测试,“应该相同”,“相等”,“相等”并且它有效。你的意思是说 assertSame 只适用于对象引用?
    • assertSame 实际上很方便,您想确认返回的是完全相同的对象,而不是相等的副本。但大多数时候assertEquals() 是更好的选择。
    • 你是对的,我在对象上测试了 assertSame 并且它有效。再次感谢。
    【解决方案2】:

    您原来在“默认研究”中使用小写 d,但您预期的字符串没有。

    编辑:比较字符串时,您应该始终使用 equals() 而不是比较引用。通过 equals() 测试的两个字符串可能是也可能不是同一个对象。

    顺便说一句,在 Groovy 中 == 与 equals() 相同。

    【讨论】:

    • 感谢 == 提示!我刚试了一下,它奏效了。我认为 Tomasz 的(硬名称)回答很好地涵盖了它。不过还是感谢您的提醒。
    • 如果你想在 Groovy 中比较引用,请使用 is() 函数。例如:def sameObject = a.is(b)
    • 那个函数的命名让我害怕。可能它应该被命名为“like()”而不是“is()”。当我阅读代码时它让我感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2019-03-07
    • 2012-09-22
    • 2016-03-06
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多