JUnit AssertSame在groovy中的object.toString上失败

时间:2011-10-21 11:38:02

标签: groovy junit

我正在尝试在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可以很好地使用相同的参数。 我知道这不是什么大事,但我想知道它失败的原因。

由于

2 个答案:

答案 0 :(得分:3)

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

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

我知道你使用的Groovy并没有遇到这个问题,但是JUnit是用Java编写的,并且按照上面的规则运行。

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

==

<击>

答案 1 :(得分:0)

您的原始文件在“默认研究”中使用小写d,但您的预期字符串不会。

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

BTW,在Groovy中==与equals()相同。