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。谢谢,我现在明白了。谢谢,我现在明白了。好主意。会实施的。好主意。将实施。