请教JUnit的一个小问题(不知道是不是应该放到Java版?)

pwair 2003-07-09 05:09:13
我刚开始学习JUnit,照网上的教程作了一个小例子,有一些疑惑请各位高手看一下,谢谢了。
class及testclass 如下:

public class Money {
private int fAmount;
private String fCurrency;

public Money(int amount, String currency) {
fAmount = amount;
fCurrency = currency;
}

public Money add(Money m) {
return new Money(amount() + m.amount(), currency());
}

public int amount() { return fAmount; }
public String currency() { return fCurrency; }
}
————————————————————————————-——————
package Test;

import junit.framework.*;
import Money;
public class TestMoney2_1 extends TestCase {

public TestMoney2_1(String s) {
super(s);
}
private Money money1, money2, money3;

protected void setUp() {
String curr = "NTD";
int val1 = 2002;
int val2 = 345;

money1 = new Money(val1, curr);
money2 = new Money(val2, curr);
money3 = new Money(val1 + val2, curr);
}

public void testSimpleAdd() {
Money money10 = money1.add(money2);
assertEquals(money3, money10);
}
}
我以为结果应该是success,可是结果却是:
.F

Time: 0.02

There was 1 failure:

1) testSimpleAdd(Test.TestMoney2_1)junit.framework.AssertionFailedError: expected:<Money@765291> but was:<Money@26e431>

at Test.TestMoney2_1.testSimpleAdd(TestMoney2_1.java:27)

FAILURES!!!

Tests run: 1, Failures: 1, Errors: 0

不知道是什么原因,小弟刚刚接触java和junit,还请各位不吝赐教,谢谢。
...全文
105 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pwair 2003-07-10
  • 打赏
  • 举报
回复
谢谢各位的帮助。
fastpoint(Dawn) 你好,我照你说的在class Money中重定义了equals()方法:
public boolean equals(Money obj) {
if (obj.amount() == this.fAmount && obj.currency().equals(this.fCurrency))
return true;
else
return false;
}
再次运行测试的时候就成功了。
谢谢你。
frenzieddragon 2003-07-09
  • 打赏
  • 举报
回复
fastpoint是51cmm上的fastpoint吗?
fastpoint 2003-07-09
  • 打赏
  • 举报
回复
所以你会发现断言失败的输出是expected:<Money@765291> but was:<Money@26e431>,“Money@26e431”@后面的就是该对象的句柄,你也可以当成C++的指针,指向Java的jvm为该对象创建的内存空间首地址。

那个 metome(陪你看夕阳) 不懂就不要乱说话。
fastpoint 2003-07-09
  • 打赏
  • 举报
回复
equals()是java的Object类的原生方法,如果你不覆盖该方法,则该方法将永远使用“==”运算符进行两个对象的比较,可以看看《think in java》,里面有详细的注解。
fastpoint 2003-07-09
  • 打赏
  • 举报
回复
Junit的assertEquals(Object expected, Object actual)的内部代码使用了expected.equals(actual),而assertSame(Object expected, Object actual)的内部代码使用了expected == actual。

第一种是用于对象内部哈希值得比对,第二种是用于对象地址的比对。
metome 2003-07-09
  • 打赏
  • 举报
回复
.F
说明测试失败,F前面那个点代表测试失败的个数,几个点就代表有几项失败。

“assertEquals”(断言相等),比较期望值和被测试类的结果是否一致。

“at Test.TestMoney2_1.testSimpleAdd(TestMoney2_1.java:27)”
说明TestMoney2_1.java的27行出的错,你的测试结果 期望值是<Money@765291> ,但实际的值是<Money@26e431>




frenzieddragon 2003-07-09
  • 打赏
  • 举报
回复
表明测试结果不通过,money3 != money10,你的Money类没有重新定义equals方法,缺省的equals方法是比较二者是不是同一个内存地址的对象,你应该重新定义equals方法来比较两个对象的内部属性是否相同,或者在测试方法中比较两个对象的属性

5,227

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 质量管理/软件测试
功能测试压力测试安全性测试 个人社区 湖南省·长沙市
社区管理员
  • 软件测试
  • 虫无涯
  • 小博测试成长之路
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎大家加入到软件测试的社区,在这里,希望大家勇于发表自己的看法,欢迎大家分享自己在软件测试工作过程中遇到的问题以及工作经验分享。

1.想转行的小伙伴,遇到问题没有及时回复的,可以私聊小博进行反馈

2.大家对社区有好的建议,都可以在社区发帖进行反馈

推荐大家学习的软件测试入门笔记:软件测试入门学习笔记

试试用AI创作助手写篇文章吧