assertEquals()与HashSet

时间:2017-08-25 12:32:22

标签: java unit-testing 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是一种好习惯吗?

4 个答案:

答案 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开发人员可以更改的字符串,甚至不会通知任何人...作为对此的隐含

@test失败了....

你应该在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"));
}