2017-07-15 48 views
-3

我正在写一个纸牌游戏并拥有一个Card类和一个Playable类。可玩牌代表玩家可能选择为给定游戏状态玩的牌的集合。我正在测试一个获得合法Playables集合的函数。我的方法是手动构造正确的答案,然后声明它等于我的函数返回的集合。具有相同字段的自定义对象集不计算为“相等”

这是我的设置功能。 cardsList<Card>类型的私人成员。

@Before 
    public void setup() { 
     cards = new ArrayList<Card>(); 
     cards.add(new Card(Suit.HEARTS, CardValue.ACE)); 
     cards.add(new Card(Suit.DIAMONDS, CardValue.ACE)); 
     cards.add(new Card(Suit.CLUBS, CardValue.ACE)); 
     cards.add(new Card(Suit.SPADES, CardValue.ACE)); 
     cards.add(new Card(Suit.CLUBS, CardValue.EIGHT)); 
     cards.add(new Card(Suit.HEARTS, CardValue.EIGHT)); 
     cards.add(new Card(Suit.SPADES, CardValue.EIGHT)); 
     cards.add(new Card(Suit.DIAMONDS, CardValue.SIX)); 
     cards.add(new Card(Suit.SPADES, CardValue.SIX)); 
     hand = new Hand(cards); 
    } 

这里是测试用例。

@Test 
public void testGetLegalDoubles() throws Exception { 
    Card toBeat = new Card(Suit.CLUBS, CardValue.NINE); 
    Set<Playable> correct = new HashSet<Playable>(); 
    Collection<Card> doubles1 = Arrays.asList(new Card[] {cards.get(0), cards.get(1)}); 
    Collection<Card> doubles2 = Arrays.asList(new Card[] {cards.get(0), cards.get(2)}); 
    Collection<Card> doubles3 = Arrays.asList(new Card[] {cards.get(0), cards.get(3)}); 
    Collection<Card> doubles4 = Arrays.asList(new Card[] {cards.get(1), cards.get(2)}); 
    Collection<Card> doubles5 = Arrays.asList(new Card[] {cards.get(1), cards.get(3)}); 
    Collection<Card> doubles6 = Arrays.asList(new Card[] {cards.get(2), cards.get(3)}); 
    Playable move1 = new Playable(doubles1, PlayMode.DOUBLES, cards.get(0)); 
    Playable move2 = new Playable(doubles2, PlayMode.DOUBLES, cards.get(0)); 
    Playable move3 = new Playable(doubles3, PlayMode.DOUBLES, cards.get(0)); 
    Playable move4 = new Playable(doubles4, PlayMode.DOUBLES, cards.get(1)); 
    Playable move5 = new Playable(doubles5, PlayMode.DOUBLES, cards.get(1)); 
    Playable move6 = new Playable(doubles6, PlayMode.DOUBLES, cards.get(2)); 
    correct.add(move1); 
    correct.add(move2); 
    correct.add(move3); 
    correct.add(move4); 
    correct.add(move5); 
    correct.add(move6); 
    Set<Playable> doubles = hand.getLegalNOfAKind(2, toBeat); 
    assertEquals(doubles, correct); 
} 

这个测试用例失败,但我已经试过打印出的doublescorrect内容和它们匹配 - 我toString()Playable实施显示了这些类的所有领域。我也覆盖equals()hashCode()CardPlayable如下所示(由Eclipse自动生成)。

Card

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((suit == null) ? 0 : suit.hashCode()); 
    result = prime * result + ((value == null) ? 0 : value.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Card other = (Card) obj; 
    if (suit != other.suit) 
     return false; 
    if (value != other.value) 
     return false; 
    return true; 
} 

Playable

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((cards == null) ? 0 : cards.hashCode()); 
    result = prime * result + ((highCard == null) ? 0 : highCard.hashCode()); 
    result = prime * result + ((playmode == null) ? 0 : playmode.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Playable other = (Playable) obj; 
    if (cards == null) { 
     if (other.cards != null) 
      return false; 
    } else if (!cards.equals(other.cards)) 
     return false; 
    if (highCard == null) { 
     if (other.highCard != null) 
      return false; 
    } else if (!highCard.equals(other.highCard)) 
     return false; 
    if (playmode != other.playmode) 
     return false; 
    return true; 
} 

我怀疑是东西了与我是如何构建correct - 也许怎么我引用cards

+1

''hand.getLegalNOfAKind()'使用'List'作为可玩构造函数或其他集合的第一个参数吗?该方法的代码应该是问题的一部分。 –

+1

请提供[mcve]。请注意,这并不意味着要发布所有代码。它意味着发布任何人都可以编译的代码,并获得您正在讨论的相同结果。 –

+0

你的'.equals()'方法除了比较对象的**身份**之外什么都不做,你需要了解'=='和'.equals()'之间的区别,它们**不相同。重复内容应解释不同之处。 –

回答

-2

根据其他意见,在这里得到完整的图片是棘手的。由于看起来你正在向可播放构造函数传递一系列卡片,你是否将它们作为数组存储在Playable中?如果是这样,这可能是在Playable.equals您的问题

} else if (!cards.equals(other.cards)) 
    return false; 

将永远是假的(例子);

final Integer[] is1 = new Integer[]{1}; 
final Integer[] is2 = new Integer[]{1}; 
Assert.assertFalse(is1.equals(is2)); 

集合将为您节省一些工作,因此您可以将卡作为ArrayList存储在Playable中;

public class Playable { 
    List<Card> cards; 

    public Playable (Card[] cards, other params....) { 
     .... 
     this.cards = new ArrayList(); 
     for (Card card : cards) { this.cards.add(card); } 
    } 

,并在平等有一些像(你需要首先进行排序,如果你想在名单上使用.equals):

public boolean equals() { 
     ..... 
     ..... 
     if (cards.containsAll(other.cards) && other.cards.containsAll(cards) { 
      return true; 

我会推荐一个简单的测试用例你的card.equals()是双重保证。 作为一个观察,它在这里并不重要,您使用的枚举,但它总是用.equals而不是==

​​

会更好写成

if (!suit.equals(other.suit)) 

希望这有助于一个好主意!

+0

“看起来你正在传递一个卡片数组放入Playable构造函数中“ - false - 他们使用'Arrays.asList()' –

相关问题