You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:37