代码之家  ›  专栏  ›  技术社区  ›  Ben

带有HashSet的assertEquals()

  •  0
  • Ben  · 技术社区  · 7 年前

    我有一个player类的构造函数

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

    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]]>

    我的问题是,为什么产出会有差异,这是一种良好的做法吗 这边

    4 回复  |  直到 7 年前
        1
  •  4
  •   davidxxx    7 年前

    HashSet.toString() 返回显示内部元素的字符串 [] (和 , 他们之间的性格)。
    Leadership [Leadership]

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

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

    但我认为你应该改变检索能力的方法。
    从这个意义上重命名方法。

    Set 抽象并返回 设置

    public Set<String> getAbilities(){
      return abilities;
    }
    
        2
  •  2
  •   daniu    7 年前

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

    我建议你用这种方法

    public Set<String> getAbilities()
    

    或者更好

    public Set<Ability> getAbilities()
    
        3
  •  0
  •   ΦXocę 웃 Пepeúpa ツ    7 年前

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

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

    所以“getter”返回了一个字符串,java JDK开发人员可以在不通知任何人的情况下对其进行更改。。。考虑到这一点

    测试失败了。。。。

    您应该在getter中返回一个(不可修改的)集合,并从中检查字符串值是否存在。。。

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

        4
  •  0
  •   Multithreader    7 年前

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