java 如何编写一个测试(例如.size()),如果一个ArrayList被放入一个HashSet中,其中有一个嵌套的for each循环?

jvlzgdj9  于 2023-04-19  发布在  Java
关注(0)|答案(3)|浏览(148)

我是Java新手,还在学徒阶段,真的很挣扎。我想为此写一个junit 5测试:(我应该补充说,这个项目还没有完成,我的工作方式,通过尝试创建一个游戏的二十一点,同时学习沿着的道路)

public Deck() {

    ArrayList<Card> cards = new ArrayList<>();
        //fill deck with cards
    for (Suit suit: Suit.values()) {
        for (Rank rank: Rank.values()){
            cards.add(new Card(rank,suit));
        };
    }
    HashSet<Card> deck = new HashSet<>(cards);;

现在我可以很容易地得到答案:System.out.println(deck.size());但这是作弊。
我不知道如何编写一个测试,例如void thereAre52CardsInADeck(){ },而不只是把整个代码块放在那里。
有人能帮忙/提供建议吗?
编辑:我真的是全新的,相当新的编码句号,所以道歉。这是我学习练习的一部分。
1 -通过“System.out.println(deck.size())”作弊,我的意思是在我的Deck()类的末尾(即,而不是在junit测试类中)使用它是作弊,因为我想对所有内容进行单元测试
2 -我的西装类是:

public enum Suit {HEARTS, CLUBS, Diamonds, Spades}

我的等级是

public enum Rank {
    ACE(1), DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(10), QUEEN(10), KING(10);
    private final int rankValue;

    private Rank(int rankValue) {
        this.rankValue = rankValue;
    }

    public int getRankValue(){
    return rankValue;
    }
}

我的卡类是:

public class Card {
    private final Rank rank;
    private final Suit suit;
    public Card (Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }
    public Rank getRank() {
        return rank;
    }

    public Suit getSuit(){
        return suit;
    }

    @Override
    public String toString(){
        return rank + " of " + suit;
    }

}

我现在的主要任务是:public class Main {

public static void main(String[] args){
    Deck deck = new Deck();
}

}
我已经运行了这个项目,并且知道我可以使用System.out.println(deck.size())运行它,并且如果我删除.size(),我也会得到完整的列表,但是我还没有在Junit测试中成功地解决这个问题。

wsxa1bj1

wsxa1bj11#

你的代码显示了一个使用局部变量的构造函数。你不能对方法或构造函数的内部细节进行单元测试。
你应该对方法或构造函数或与其他对象方法的交互的预期输出进行单元测试(交互测试是一个“更高级别”的测试,但只有在你找到如何使用Mockito或其他库为你处理大部分内容之前。
如果你把代码保持在构造函数中,你就不能在那里进行单元测试,因为它没有副作用--除非你在Suit.values()Rank.values()(我猜都是enums?)或者在Card的构造函数中有意外的副作用。
甚至堆在调用构造函数之前和之后都应该是相同的,因为所有对象都可能在调用该构造函数之后被垃圾收集。

ncgqoxb0

ncgqoxb02#

告诉我这是你想要的吗?或者我可以修改,如果它不完全是你所要求的

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class DeckTest {

    @Test
    void thereAre52CardsInADeck() {
        Deck deck = new Deck();

        int deckSize = deck.getDeckSize();

        Assertions.assertEquals(52, deckSize, "The deck should contain 52 cards");
    }
}
j2cgzkjk

j2cgzkjk3#

首先,在Deck类中不需要同时使用cardsdeck,只需使用

public class Deck {

    private final Set<Card> cards;

    public Deck() {
        cards = new HashSet<>();
        for (Suit suit : Suit.values()) {
            for (Rank rank : Rank.values()) {
                cards.add(new Card(rank, suit));
            }
        }
    }

    public Set<Card> getCards() {
        return cards;
    }

}

然后你需要做的是创建一个测试类,首先声明junit5上的依赖项,这里是针对maven的:

<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-engine</artifactId>
  <version>5.9.2</version>
  <scope>test</scope>
</dependency>

(See here(如果您正在使用其他依赖项管理工具)
然后这样写测试:

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.*;

class DeckTest {

    private Deck deck;

    @BeforeEach
    void setUp() {
        deck = new Deck();
    }

    @Test
    void deckHad52Cards() {
        assertEquals(52, deck.getCards().size());
    }

}

附加:

由于您的卡存储在Set中,这将确保没有重复的卡,但只有在您覆盖Card类中的equals方法时才有效,因此在Card中添加以下代码

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    Card card = (Card) o;
    return rank == card.rank && suit == card.suit;
}

@Override
public int hashCode() {
    return Objects.hash(rank, suit);
}

然后你可以通过为Card创建一个测试类来测试hat,即CardTest,并在其中包含以下2个测试:

@Test
void sameCardsShouldBeEqual() {
    assertEquals(new Card(Rank.ACE, Suit.CLUBS), new Card(Rank.ACE, Suit.CLUBS));
}

@Test
void differentCardsShouldNotBeEqual() {
    assertEquals(new Card(Rank.KING, Suit.CLUBS), new Card(Rank.ACE, Suit.CLUBS));
}

在所有这些之后,你已经测试了你有52个不同的卡在你的甲板上。

相关问题