我正在做一项作业,要求我创建代码,使其运行时不会出现错误或失败。这只是一个测试用例:
Toy t1 = new Toy(1000121, "Red Bike", 3, 98.90);
Toy t2 = new Toy(1000123, "Colouring Book", 4, 19.89);
Toy t3 = new Toy(1000128, "Skateboard", 5, 149.99);
Toy t4 = new Toy(1000127, "SpongeBob DVD", 3, 14.99);
Toy t5 = new Toy(1000130, "Bike Helmet", 1, 18.99);
Toy t6 = new Toy(1000125, "Toy car", 10, 3.99);
Toy t7 = new Toy(1000129, "Ball", 2, 5.59);
Toy t8 = new Toy(1000189, "Teddy Bear", 3, 10.79);
Toy[] listofToy1 = { t1, t2 };
Child c1 = new Child("James", 1, listofToy1);
assertTrue(c1.getChildToy().length == 2 && c1.getChildToy()[0] != t1 && c1.getChildToy()[1] != t2);
assertTrue(c1.getChildToy().length == 2 && c1.getChildToy()[0].getToyName().equals("Red Bike") && c1.getChildToy()[1].getToyName().equals("Colouring Book"));
assertTrue(c1.getChildToy().length == 2 && c1.getChildToy()[0].getToyQuantity() == 3 && c1.getChildToy()[1].getToyQuantity() == 4);
我的问题是第一个assertTrue是如何工作的?我是不是错过了什么?
您可以通过其名称来推断每个方法的含义。作为参考,
getChildToy
方法将返回 Toy 对象的数组。玩具对象来自第 1-8 行创建的玩具
对我来说,看起来
Child c1
是用一系列玩具创建的,其中分别包含索引 0 和 1 中的 t1
和 t2
。那么,从第一个断言来看,c1.getChildToy()[0]
怎么会不等于t1
呢?
如果
c1.getChildToy()[0]
不等于 t1
,第二个断言中的 c1.getChildToy()[0].getToyName().equals("Red Bike")
怎么可能为真?
任何帮助将不胜感激,谢谢。
编辑:我尝试了system.out.println。
System.out.println(c1.getChildToy()[0].getToyInformation());
System.out.println(c1.getChildToy()[1].getToyInformation());
控制台显示:
(1000121, "Red Bike", 3, 98.90)
(1000123, "Colouring Book", 4, 19.89)
与第 1 行和第 2 行匹配
附注getToyInformation 方法只是将玩具对象中的信息放入格式化字符串中
您似乎认为
==
表示“相同内容”。
事实并非如此。这意味着“相同的参考”。
该方法正在测试的是
Child
构造函数接受其玩具输入(第三个参数)并克隆每个玩具对象。
想象我盖一座房子。
然后我在隔壁建造了完全相同的房子。相同的布局。墙壁漆成同样的颜色。我什至把它们装饰得一模一样。
他们是同一所房子吗?不。但是,它们是相同的设计。
house1 == house2
是假的,因为不是同一所房子。
不过,house1.equals(house2)
是真的。
我们可以在java中简单地看到这一点:
String a = "Hello".toLowerCase();
System b = "Hello".toLowerCase();
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
我们在这里制作了 2 根弦。然而,它们恰好具有相同的内容。它们就像两栋一模一样的房子。
请注意,这里的整个设置(数组、可变对象、防御性克隆)已经过时了 20 年的代码风格,我不知道这是什么课程或教程,但是,oof。它非常过时了。