java - 带有 HashSet 的assertEquals()

标签 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 是一个好习惯吗?这边走?

最佳答案

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

这对于断言来说是可以的:

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

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

否则,保留 Set 抽象并按原样返回 Set :

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

关于java - 带有 HashSet 的assertEquals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45881527/

相关文章:

java - 使用 Jackson 解析数组

java - Android Studio Gradle同步失败,CreateProcess错误= 5

类似于浏览器中的 JavaFX TabPane 系统

unit-testing - 我们如何测试构建 R 包时未公开的函数?

.net - HashSet<T>.Contains 如何比 List<T>.Contains 快?

java - 模数运算返回奇怪的结果

python 单元测试: can't call decorated test

javascript - 使用 Jest 监视启动的模块

java集合保持顺序并且应该是唯一的

java - 声明为父接口(interface)并初始化为子实例