2017-08-25 6 views
0

と私はプレイヤーのクラスのコンストラクタを持ってのassertEquals()HashSetの

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

      this.name = name; 
      this.playerDescription; 
      this.abilities = abilities; 
} 

私はに追加する、私はaddAbilities()メソッドを作成しました

Player p = new Player ("Jon Snow", "Brave Swordsman", new HashSet<String>()); 

このクラスのインスタンスを作成しますHashSet。しかし

public void addAbilities(String newAbility) { 
    abilities.add(newAbility); 
} 

、私は

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

    return abilityString; 
} 

私のテスト(getメソッドを使用して)メソッドをテストするために行く:

@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この方法を作成することをお勧めしましたか?

+1

あなたは文字列にセット全体を変換しているので、あなたが代わりに呼び出すプレーヤー#hasAbility(文字列) ''のようなメソッドを持っている必要があり 'アビリティ#が「私ができる – Rogue

+1

contains'出力が間違っている理由をすぐに知ることができますが、何か他の問題に対処するには、コンストラクタにハッシュセットを受け入れる必要がありますか?コンストラクタの内部に作成するだけではありませんか? – Carcigenicate

+0

引数や変数を 'HashSet'として宣言しないでください。実装が変更される可能性があるので、 'Set'だけを使用してください...また、事前定義された能力のために' enum'を使用してください。 –

答えて

4

HashSet.toString()[]内の要素を表示する文字列を返す(およびそれらの間の,文字で)行うことをお勧めしたいです。
あなたのアサーションでは、Leadership[Leadership]を比較します。

これは、アサーションのために[OK]を次のようになります。

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

しかし、私はあなたではなく能力を取得する方法を変更する必要があることだと思います。
検索と書式設定の方法ですか? この意味でメソッドの名前を変更してください。

そうでない場合は、Set抽象化を維持し、それがあるとしてだけSetを返す:

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

ありがとう、私は今理解しています。 – Ben

2

Set toString出力のフォーマットは "[item1、item2、...]"です。アイテムは1つしかないので、「[item1]」です。

私はあなたがこの方法

まだ
public Set<String> getAbilities() 

またはそれ以上

public Set<Ability> getAbilities() 
+0

素晴らしいアイデア。実装します。 – Ben

0

あなたのコードは、最初のものは

能力が収集されているポイントのカップルで、潜在的な欠陥を持っています、 「ゲッター」は、文字列というのJava JDKのdeveloをバック与えているように、それは文字列

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

    return abilityString; 
} 

を返すためので、このゲッターは正しくありません。人は誰にも知らずに変わることがあります...そのことを考えると、

@testが失敗しています....

あなたは文字列値が存在するかどうかを確認ゲッターにし、そこから(変更不可能な)コレクションを返す必要があります...

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

は今、あなたはのtoStringと、将来的に何が起こっているかのindeendentです

public boolean hasAbility(String ability) { 
    return abilities.contains(ability); 
} 

を追加をテストするためとして:私はgetAbility()メソッドを削除し、追加することをお勧めHashSetの

0

の実装この方法、あなたがこれを行うことができます:

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

    assertTrue(p.hasAbility("Leadership")); 
} 
関連する問題