我正在尝试在groovy中测试被覆盖的toString()(我知道它是微不足道的,但这是你在阅读肯特贝克的TDD书后得到的)。 我断言预期的字符串和实际
以下是代码块:
@Test void testToString(){ def study = new Study(identifier:"default-study", OID:"S_DEFAULTS1", name:"Default Study") def expected = "org.foo.oc.model.bar(OID:S_DEFAULTS1, name:Default Study, identifier:default-study)" assertSame "Should be equal", expected, study.toString() }
以下是失败测试的堆栈跟踪:
junit.framework.AssertionFailedError: Should be equal expected same:org.foo.oc.model.bar(OID:S_DEFAULTS1, name:Default Study, identifier:default-study) was not:org.foo.oc.model.bar(OID:S_DEFAULTS1, name:Default Study, identifier:default-study) at junit.framework.Assert.fail(Assert.java:47) at junit.framework.Assert.failNotSame(Assert.java:273) at junit.framework.Assert.assertSame(Assert.java:236)
只是补充一点,assertEquals可以很好地使用相同的参数。 我知道这不是什么大事,但我想知道它失败的原因。
由于
答案 0 :(得分:3)
为什么不使用使用assertEquals
的{{1}}? .equals()
比较对象引用(assertSame
运算符)。即使字符串相同,它们也是两个不同的对象,因此断言失败。
更新:这是Java中一个非常常见的错误:==
和String.equals()
运算符的工作方式不同。这已经多次讨论过了:
我知道你使用的Groovy并没有遇到这个问题,但是JUnit是用Java编写的,并且按照上面的规则运行。
更新:实际上,您的字符串 不同:
==
击> <击> 撞击>
答案 1 :(得分:0)
您的原始文件在“默认研究”中使用小写d,但您的预期字符串不会。
编辑:比较字符串时,应始终使用equals()而不是比较引用。通过equals()测试的两个字符串可能也可能不是同一个对象。
BTW,在Groovy中==与equals()相同。