2017-08-25 98 views
0

我对球员类的构造函数的assertEquals()用一个HashSet

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这样?

+1

因为你整个集合转换为字符串,则应该有一个像'球员#hasAbility(字符串)'它调用的方法'能力#contains' – Rogue

+1

我可以”立即明白为什么输出是错误的,但为了解决其他问题,你确定你需要让构造函数接受一个哈希集?难道你不能在构造函数中创建一个吗? – Carcigenicate

+0

不要将参数或变量声明为'HashSet'。因为实现可能会改变,所以只使用'Set' ...另外,对于预定义的功能,使用'enum's。 –

回答

4

HashSet.toString()返回一个字符串显示内部[]元素(和它们之间,字符)。
因此,在您的断言中,您将Leadership[Leadership]比较。

这将为断言是确定:

assertEquals("[Leadership]", s.getAbility()); 

但我认为你应该改变,而检索能力的方法。
它是一种检索和格式化方法? 从这个意义上重命名该方法。

,否则保持Set抽象,就回到了Set,因为它是:

public Set<String> getAbilities(){ 
    return abilities; 
} 
+0

谢谢,我现在明白了。 – Ben

2

Set toString输出的格式是“[item1,item2,...]”。你只有一个项目,所以它是“[item1]”。

我建议你使用此法

public Set<String> getAbilities() 

或者更好的

public Set<Ability> getAbilities() 
+0

好主意。将实施。 – Ben

0

你的代码有潜在缺陷在几个点,第一个是

能力是一个集合,所以此getter是不正确的,因为它返回一个字符串

public String getAbility() { 
    String abilityString = abilities.toString(); 

    return abilityString; 
} 

让“吸”是给回一个字符串的Java JDK开发板的人可以改变,甚至没有通知任何人...作为一种神秘感

@test失败....

你应该在getter和从检查字符串值是否存在返回(一个不可修改的)收集...

Set<String> mySet = new HashSet<>(); 
mySet.add("Leader"); 
mySet.contains("Leader"); 

现在,你是什么在未来的的toString发生的indeendent实施一个HashSet

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")); 
}