51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 13432|回复: 9
打印 上一主题 下一主题

assertEquals与assertSame的区别(新手请教)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2005-5-24 13:54:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏

该用户从未签到

2#
发表于 2005-5-25 08:53:13 | 只看该作者
俺用的是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
就我个人理解,你的理解基本正确,但有一点:如果为同一个对象,其值应该就是相等的。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2005-5-25 12:08:22 | 只看该作者
:d
明白了 呵呵 通过这个例子看得比较清楚,否则仅靠语言描述 总是不太理解
谢谢someone5!!
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 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>


这是怎么回事呀?
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 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);
        }
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 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 ]
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 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 ]
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2005-5-26 08:27:40 | 只看该作者
我记得之前学VC++的时候好像是说仅使用数组的名称,则表示指向该数组的指针,但是Java里没有指针,所以我也搞不太清楚。之前学的Java的内容基本上都快还给老师了,呵呵
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 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 ]
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 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 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-8 22:32 , Processed in 0.076518 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表