如何为Blackjack游戏Deck类编写JUnit5卡牌数量验证测试?
解决方法
要验证Deck初始化后卡牌数量为52,你不需要重复构造方法里的生成逻辑,只需要给Deck类添加一个封装内部卡牌数量的公共方法,然后在JUnit5测试中调用这个方法即可。
步骤1:给Deck类添加获取卡牌数量的方法
在Deck类中新增一个getCardCount()方法,返回内部HashSet的大小。这样测试代码无需关心Deck内部如何生成卡牌,只依赖公共API:
import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class Deck { private final Set<Card> cards; public Deck() { ArrayList<Card> tempList = new ArrayList<>(); // 嵌套循环生成所有花色和点数的卡牌 for (Suit suit : Suit.values()) { for (Rank rank : Rank.values()) { tempList.add(new Card(suit, rank)); } } this.cards = new HashSet<>(tempList); } // 新增方法:返回当前牌组的卡牌数量 public int getCardCount() { return cards.size(); } }
步骤2:编写JUnit5测试方法
直接实例化Deck对象,调用getCardCount()并验证结果为52:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class DeckTest { @Test void thereAre52CardsInADeck() { Deck deck = new Deck(); assertEquals(52, deck.getCardCount(), "一副标准牌组应包含52张卡牌"); } }
关键注意事项:确保Card类正确重写equals和hashCode
因为你用HashSet存储卡牌,必须保证相同花色和点数的Card对象被视为相等,否则即使构造方法生成的是52种不同组合,HashSet可能会因为对象引用不同而误判。所以Card类必须重写这两个方法:
import java.util.Objects; public class Card { private final Suit suit; private final Rank rank; public Card(Suit suit, Rank rank) { this.suit = suit; this.rank = rank; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Card card = (Card) o; return suit == card.suit && rank == card.rank; } @Override public int hashCode() { return Objects.hash(suit, rank); } // 可选:添加getter方法,方便后续扩展功能 public Suit getSuit() { return suit; } public Rank getRank() { return rank; } }
补充:Suit和Rank枚举类示例
你的花色和点数应该定义为枚举类,确保只有合法的取值:
public enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES } public enum Rank { ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING }
这种方案遵循了封装原则,测试代码与Deck内部实现解耦——哪怕以后你把HashSet换成其他集合类型,测试代码也不需要修改。
内容的提问来源于stack exchange,提问作者Bobby2Kills
相关产品推荐
相关产品推荐

