我有一个播放器类的构造函数
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
是一种好习惯吗?
答案 0 :(得分:4)
HashSet.toString()
返回一个String,显示[]
内的元素(并在它们之间加,
个字符)。
因此,在您的断言中,您将Leadership
与[Leadership]
进行比较。
这对于断言是可以的:
assertEquals("[Leadership]", s.getAbility());
但我认为你应该改变方法来检索能力
它是一种检索和格式化方法吗?
从这个意义上重新命名方法
否则,保持Set
抽象,并按原样返回Set
:
public Set<String> getAbilities(){
return abilities;
}
答案 1 :(得分:2)
Set toString输出的格式为&#34; [item1,item2,...]&#34;。你只有一个项目,所以&#34; [item1]&#34;。
我建议你制作这个方法
public Set<String> getAbilities()
或者更好
public Set<Ability> getAbilities()
答案 2 :(得分:0)
你的代码在几个方面存在潜在的缺陷,第一个是
ability是一个集合,所以这个getter不正确,因为它返回一个String
public String getAbility() {
String abilityString = abilities.toString();
return abilityString;
}
这样“getter”会返回一个java JDK开发人员可以更改的字符串,甚至不会通知任何人...作为对此的隐含
你应该在getter中返回一个(不可修改的)集合,并检查字符串值是否存在......
Set<String> mySet = new HashSet<>();
mySet.add("Leader");
mySet.contains("Leader");
现在你对使用hashSet的toString实现将来发生的事情不知情
答案 3 :(得分:0)
我建议删除getAbility()
方法并添加:
public boolean hasAbility(String ability) {
return abilities.contains(ability);
}
对于测试添加方法,您可以这样做:
@Test
public void testAddAbility() {
Player p = new Player("Jon Snow", "Brave Swordsman", new HashSet<String>());
p.addAbility("Leadership");
assertTrue(p.hasAbility("Leadership"));
}