ting_yt2 发表于 2005-5-24 13:54:50

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:13

俺用的是NUnit,运行以下这段程序

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:22

:d
明白了 呵呵 通过这个例子看得比较清楚,否则仅靠语言描述 总是不太理解
谢谢someone5!!

ting_yt2 发表于 2005-5-25 12:22:08

哎呀 我把这个例子转换为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:19

接下来改成以下样子,结果全通过了

又迷糊了: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:19

在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:09

是不是说
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:40

我记得之前学VC++的时候好像是说仅使用数组的名称,则表示指向该数组的指针,但是Java里没有指针,所以我也搞不太清楚。之前学的Java的内容基本上都快还给老师了,呵呵

wangxh1000 发表于 2005-6-9 19:19:13

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跟了一下,

[*] assertEquals("string1和string4不相等", string1, string4);进入
[*] static public void assertEquals(String message, Object expected, Object actual) {
                if (expected == null && actual == null)
                        return;
                if (expected != null && expected.equals(actual))
                        return;
                failNotEquals(message, expected, actual);
        }
其中if (expected != null && expected.equals(actual))语句,方法expected.equals(actual)的说明是“true if this object is the same as the obj argument; false otherwise.”,就是说,这里比较的还是String1、String4是不是同一个对象。


关于这个问题的更多讨论可以参见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:10

Originally posted by ting_yt2 at 2005-5-25 02:16 PM:
是不是说
assertSame("string1和string4不相同",string1,string4); 这句可能通过也可能不通过,要看其内存中是否已经存在该对象?

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


[*] assertSame("string1和string4不相同",string1,string4);
这里比较string1、string4是不是同一个对象

[*] assertEquals("string1和string4不相等",string1,string4);
当这样声明的时候
String[] string1 = {"1","2"};
String[] string3 = string1;
String[] string4 = {"1","2"};
从结果看string1、string4指向两个对象

当这样声明的时候
String string1 = "11";
String string3 = string1;
String string4 = "11";
string1、string4指向一个对象
原因,就是someone5说的
“1. String s1 = "11";
方法1中,先在内存中查找有没有"11"这个字符串对象存在,如果存在就把s1指向这个字符串对象;”

[*] assertEquals(java.lang.Object expected, java.lang.Object actual) ,其中的Object指狭义的 也就是不包括iboolean,byte,char,double,float,int,long,string的object
是的
页: [1]
查看完整版本: assertEquals与assertSame的区别(新手请教)