我有一个玩家类的构造函数
public Player(String name, String playerDescription,
HashSet<String> abilities) {
this.name = name;
this.playerDescription;
this.abilities = abilities;
}我创建这个类的一个实例
Player p = new Player ("Jon Snow", "Brave Swordsman", new HashSet<String>());我创建了一个addAbilities()方法,以添加到HashSet中。
public void addAbilities(String newAbility) {
abilities.add(newAbility);
}但是,当我去测试该方法时(使用get方法)
public String getAbility() {
String abilityString = abilities.toString();
return abilityString;
}我的测试:
@Test
public void testAddAbility() {
Player p = new Player("Jon Snow", "Brave Swordsman", new HashSet<String>());
s.addAbility("Leadership");
assertEquals("Leadership", s.getAbility());
}我得到了测试输出的差异。
比较失败:预期:<[Leadership]>但是<[[Leadership]]>
我的问题是,为什么在输出方面存在差异,以这种方式制作HashSet是一个很好的实践吗?
发布于 2017-08-25 12:37:19
HashSet.toString()返回一个字符串,显示[]内部的元素(以及它们之间的,字符)。
因此,在您的断言中,您将Leadership与[Leadership]进行比较。
这是可以断言的:
assertEquals("[Leadership]", s.getAbility());但我认为你应该改变方法来恢复能力。
这是一种检索和格式化方法吗?在这个意义上重命名该方法。
否则,保留Set抽象,只返回原来的Set:
public Set<String> getAbilities(){
return abilities;
}发布于 2017-08-25 12:35:26
集合toString输出的格式是"item1,item2,.“。你只有一个项目,所以它是"item1“。
我建议你做这个方法
public Set<String> getAbilities()或者更好
public Set<Ability> getAbilities()发布于 2017-08-25 12:47:24
您的代码在几个点上有潜在的缺陷,第一个是
能力是一个集合,所以这个getter不正确,因为它返回一个字符串。
public String getAbility() {
String abilityString = abilities.toString();
return abilityString;
}因此,"getter“返回了一个字符串,java JDK开发人员可以在不通知任何人的情况下更改.作为对这件事的补充
考试失败了..。
您应该在getter中返回一个(不可修改的)集合,并从该集合中检查字符串值是否存在.
Set<String> mySet = new HashSet<>();
mySet.add("Leader");
mySet.contains("Leader");现在,您已经了解了toString实现hashSet的未来发生了什么。
https://stackoverflow.com/questions/45881527
复制相似问题