我正在编写一个JUnit测试用例来比较两个StringBuffers。 (测试将检查字符串反转。)
@Test
public void testReverseString() {
StringBuffer orig = new StringBuffer("fedcba");
StringBuffer exp = new StringBuffer("abcdef");
// function will reverse the string so
// orig will be "abcdef" after the call
Question1_2.reverseString(orig);
//System.out.println(exp + " " + orig); // output - abcdef abcdef
//assertEquals(exp.toString(), orig.toString()); This Passes
//assertEquals(exp, orig); This FAILS
//assertTrue(exp.equals(orig)); This FAILS
}
根据这个JUnit to test for StringBuffers assertEquals(exp,orig);应该工作。
assertEquals(exp.toString(), orig.toString()); This Passes
//assertEquals(exp, orig); This FAILS
//assertTrue(exp.equals(orig)); This FAILS
我不确定我是否误解了一些基本的东西,包括String,StringBuffer和JUnit assertEquals。
由于 阿米特
答案 0 :(得分:2)
StringBuffer
不会覆盖equals()
方法。因此,它使用Object
类的实现来检查引用相等性(检查两个对象是否都是相同)。
在你的情况下,两个对象显然不一样(虽然它们的内容是相同的),因此它失败了。
另一方面, String
会覆盖equals()
方法,如果两个字符串的内容相同,则返回true
。
答案 1 :(得分:0)
在First Expression中答案很简单
(i)assertEquals(exp.toString(), orig.toString());
传递String
对象作为参数。 assertEquals重载了String
类。因此,它将接受它作为String
并检查值的相等性。所以,这将通过测试。
(ii)assertTrue(exp, orig);
这里传递StringBuffer
对象作为参数assertEquals没有超载StringBuffer
类。因此,它将接受它作为Object
并检查引用相等而不是值。因此,这将在测试期间引发异常。
(iii)assertEquals(exp.equals(orig));
在这里,您使用的equals
方法实际上属于对象类而不是StringBuffer
。 。所以,再次它将检查引用相等而不是值。所以,这将使测试失败,因为两个对象都指的是不同的Object
。
答案 2 :(得分:0)
assertEquals(exp,orig);基本上是比较两个对象的引用。如您所知,在内存中,两个对象都是使用唯一引用ID单独创建的,这就是测试用例失败的原因。
请参阅以下代码及其输出:
@Test
public void equal()
{
TestClass obj1= new TestClass();
TestClass obj2= new TestClass();
Assert.assertEquals(obj1,obj2);
}
以下是输出,您可以在其中清楚地看到作为内存引用的预期和实际结果。
java.lang.AssertionError:
Expected :com.company.TestClass@6c20cbef
Actual :com.company.TestClass@5d2cef5e
现在,如果我将obj1分配给obj2,那么两个对象引用都指向同一个对象;请参阅以下示例,该示例将通过测试用例。
@Test
public void equal()
{
TestClass obj1= new TestClass();
TestClass obj2;
obj2= obj1;
Assert.assertEquals(obj1,obj2);
}