51Testing软件测试论坛

标题: assertEquals与assertSame的区别(新手请教) [打印本页]

作者: ting_yt2    时间: 2005-5-24 13:54
标题: assertEquals与assertSame的区别(新手请教)
assertEquals(java.lang.Object expected, java.lang.Object actual)
assertSame(java.lang.Object expected, java.lang.Object actual)
请教以上两种方法的区别

网上看到
assertEquals:用于判断实际值和期望值是否相同
assertSame:判断实际值和期望值是否为同一个对象

不知是否可以这样理解:(新手,提问不当之处还请见谅)
assertEquals(java.lang.Object expected, java.lang.Object actual)
——仅判断值是否相等,是否为同一个对象则不关心(可能存在不同对象,但值相等的情况吗?)

assertSame(java.lang.Object expected, java.lang.Object actual)
——判断是否为同一个对象,但不关心两者的值是否相等

刚刚开始学习Junit,还请各位前辈指教!

[ Last edited by ting_yt2 on 2005-5-24 at 14:02 ]
作者: someone5    时间: 2005-5-25 08:53
俺用的是NUnit,运行以下这段程序
[Test]
public void TestForAreEqual()
{
     string[] string1 = {"1","2"};
     string[] string3 = string1;
     string[] string4 = {"1","2"};
     Assert.AreSame(string1,string3,"string1和string3不相同");
     Assert.AreEqual(string1,string3,"string1和string3不相等");
     Assert.AreEqual(string1,string4,"string1和string4不相等");
     Assert.AreSame(string1,string4,"string1和string4不相同");
}
运行结果如下:
TestForAreEqual : string1和string4不相同 expected same
就我个人理解,你的理解基本正确,但有一点:如果为同一个对象,其值应该就是相等的。
作者: ting_yt2    时间: 2005-5-25 12:08
:d
明白了 呵呵 通过这个例子看得比较清楚,否则仅靠语言描述 总是不太理解
谢谢someone5!!
作者: ting_yt2    时间: 2005-5-25 12:22
哎呀 我把这个例子转换为Junit的:

public void testAssert(){
      String[] string1 = {"1","2"};
      String[] string3 = string1;
      String[] string4 = {"1","2"};
      assertSame("string1和string3不相同",string1,string3);
      assertEquals("string1和string3不相等",string1,string3);
      assertEquals("string1和string4不相等",string1,string4);
      assertSame("string1和string4不相同",string1,string4);
}

可是结果是:
string1和string4不相等 expected:<[Ljava.lang.String;@1d58aae> but was:<[Ljava.lang.String;@83cc67>
       
string1和string4不相同 expected same:<[Ljava.lang.String;@1d58aae> but was:<[Ljava.lang.String;@83cc67>


这是怎么回事呀?
作者: ting_yt2    时间: 2005-5-25 12:27
接下来改成以下样子,结果全通过了

又迷糊了:s


            public void testAssert(){
                String string1 = "11";
                String string3 = string1;
                String string4 = "11";
                assertSame("string1和string3不相同",string1,string3);
                assertEquals("string1和string3不相等",string1,string3);
                assertEquals("string1和string4不相等",string1,string4);
                assertSame("string1和string4不相同",string1,string4);
        }
作者: someone5    时间: 2005-5-25 13:53
在Java中,初始化String分为两种:
1. String s1 = "11";
2. String s2 = new String("11")
区别:
方法1中,先在内存中查找有没有"11"这个字符串对象存在,如果存在就把s1指向这个字符串对象;
方法2中,不论内存中是否已经存在"11"这个字符串对象,都会新建一个对象。

[ Last edited by someone5 on 2005-5-25 at 13:57 ]
作者: ting_yt2    时间: 2005-5-25 14:16
是不是说
assertSame("string1和string4不相同",string1,string4); 这句可能通过也可能不通过,要看其内存中是否已经存在该对象?

但是assertEquals("string1和string4不相等",string1,string4);这句是不是应该通过呢 可前面那个里这句不通过啊


Originally posted by ting_yt2 at 2005-5-25 12:22:
哎呀 我把这个例子转换为Junit的:

public void testAssert(){
      String[] string1 = {"1","2"};
      String[] string3 = string1;
      String[] string4 = {"1",& ...



还有一点,我说的是assertEquals(java.lang.Object expected, java.lang.Object actual) ,其中的Object指狭义的 也就是不包括iboolean,byte,char,double,float,int,long,string的object

[ Last edited by ting_yt2 on 2005-5-25 at 15:04 ]
作者: someone5    时间: 2005-5-26 08:27
我记得之前学VC++的时候好像是说仅使用数组的名称,则表示指向该数组的指针,但是Java里没有指针,所以我也搞不太清楚。之前学的Java的内容基本上都快还给老师了,呵呵
作者: wangxh1000    时间: 2005-6-9 19:19
Originally posted by ting_yt2 at 2005-5-25 12:22 PM:
哎呀 我把这个例子转换为Junit的:

public void testAssert(){
      String[] string1 = {"1","2"};
      String[] string3 = string1;
      String[] string4 = {"1",& ...


我用Eclipse跟了一下,


关于这个问题的更多讨论可以参见http://www.blueidea.com/bbs/archivecontent.asp?id=945875

[ Last edited by wangxh1000 on 2005-6-9 at 19:26 ]
作者: wangxh1000    时间: 2005-6-9 19:34
Originally posted by ting_yt2 at 2005-5-25 02:16 PM:
是不是说
assertSame("string1和string4不相同",string1,string4); 这句可能通过也可能不通过,要看其内存中是否已经存在该对象?

但是assertEquals("string1和string4不相等",string1, ...







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2