Java 带HashSet的assertEquals()

Java 带HashSet的assertEquals(),java,unit-testing,hashset,Java,Unit Testing,Hashset,我有一个玩家类的构造函数 public Player(String name, String playerDescription, HashSet<String> abilities) { this.name = name; this.playerDescription; this.abilities = abilities; } 但是,当我去测试该方法时(使用get方法) 我的测试: @Te

我有一个玩家类的构造函数

public Player(String name, String playerDescription,
        HashSet<String> abilities) {

            this.name = name;
            this.playerDescription;
            this.abilities = abilities;
}
但是,当我去测试该方法时(使用get方法)

我的测试:

@Test
public void testAddAbility() {
Player p = new Player("Jon Snow", "Brave Swordsman", new HashSet<String>());

    s.addAbility("Leadership"); 
    assertEquals("Leadership", s.getAbility());
}
@测试
公共无效可测试性(){
玩家p=新玩家(“乔恩·斯诺”,“勇敢的剑客”,新哈希集());
s、 可添加性(“领导力”);
资产质量(“领导力”,s.getAbility());
}
我在测试输出中得到一个差异

比较失败:应为:
,但为


我的问题是,为什么输出会有差异?用这种方式创建
哈希集是否是一种良好的做法?

Set-to字符串输出的格式是“[item1,item2,…]”。您只有一个项目,因此它是“[item1]”

我建议你用这种方法

public Set<String> getAbilities()
publicsetgetabilities()
或者更好

public Set<Ability> getAbilities()
publicsetgetabilities()

Set TO字符串输出的格式为“[item1,item2,…]”。您只有一个项目,因此它是“[item1]”

我建议你用这种方法

public Set<String> getAbilities()
publicsetgetabilities()
或者更好

public Set<Ability> getAbilities()
publicsetgetabilities()
HashSet.toString()
返回一个字符串,该字符串显示
[]
中的元素(它们之间带有
字符)。
因此,在您的断言中,您将
领导力
[Leadership]

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

assertEquals("[Leadership]", s.getAbility());
但我认为您应该更改检索能力的方法。
它是一种检索和格式化方法吗? 从这个意义上重命名该方法。

否则,保留
集合
抽象,只需按原样返回
集合

public Set<String> getAbilities(){
  return abilities;
}
publicsetgetabilities(){
回归能力;
}
HashSet.toString()
返回一个字符串,该字符串显示
[]
中的元素(它们之间带有
字符)。
因此,在您的断言中,您将
领导力
[Leadership]

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

assertEquals("[Leadership]", s.getAbility());
但我认为您应该更改检索能力的方法。
它是一种检索和格式化方法吗? 从这个意义上重命名该方法。

否则,保留
集合
抽象,只需按原样返回
集合

public Set<String> getAbilities(){
  return abilities;
}
publicsetgetabilities(){
回归能力;
}

您的代码在几点上存在潜在缺陷,第一点是

ability是一个集合,因此此getter不正确,因为它返回一个字符串

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

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

@测试失败了

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

Set<String> mySet = new HashSet<>();
mySet.add("Leader");
mySet.contains("Leader");
Set mySet=new HashSet();
mySet.add(“领导者”);
mySet.contains(“Leader”);

现在,您不必关心hashSet的toString实现将来会发生什么

您的代码在几点上可能存在缺陷,第一点是

ability是一个集合,因此此getter不正确,因为它返回一个字符串

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

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

@测试失败了

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

Set<String> mySet = new HashSet<>();
mySet.add("Leader");
mySet.contains("Leader");
Set mySet=new HashSet();
mySet.add(“领导者”);
mySet.contains(“Leader”);

现在,您不必关心hashSet的toString实现将来会发生什么,我建议删除
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"));
}
@测试
公共无效可测试性(){
玩家p=新玩家(“乔恩·斯诺”,“勇敢的剑客”,新哈希集());
p、 可添加性(“领导力”);
资产真实性(p.hasAbility(“领导力”);
}

我建议删除
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"));
}
@测试
公共无效可测试性(){
玩家p=新玩家(“乔恩·斯诺”,“勇敢的剑客”,新哈希集());
p、 可添加性(“领导力”);
资产真实性(p.hasAbility(“领导力”);
}

因为您要将整个集合转换为字符串,所以应该使用一个类似于
Player#hasAbility(string)
的方法,该方法调用
abilities#contains
我无法立即看出输出错误的原因,但要解决其他问题,您确定需要构造函数接受哈希集吗?不能在构造函数中创建一个吗?不要将参数或变量声明为
HashSet
。仅使用
设置
,因为实现可能会更改。。。另外,对于预定义的能力,请使用
enum
s。因为您要将整个集合转换为字符串,所以应该使用类似
Player#hasAbility(string)
的方法,该方法调用
abilities#contains
我无法立即看出输出错误的原因,但要解决其他问题,您确定需要让构造函数接受哈希集吗?不能在构造函数中创建一个吗?不要将参数或变量声明为
HashSet
。仅使用
设置
,因为实现可能会更改。。。另外,对于预定义的能力,请使用
enum
s。谢谢,我现在明白了。谢谢,我现在明白了。好主意。会实施的。好主意。将实施。