提问者:小点点

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


我刚到Java,正在做学徒,真的很挣扎。我想为此写一个junit5测试:

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(){ },而不只是把整个代码块放在那里。这似乎效率很低。

有人能帮忙/提供建议吗?

谢啦

我一直在关注YouTube上与约翰一起编码的Junit测试视频,并试图推断如何在没有这样运气的情况下应用这个案例,并在谷歌上尝试了各种来源。这可能很简单,所以很抱歉


共2个答案

匿名用户

您的代码显示了使用局部变量的构造函数。您不能对方法或构造函数的内部细节进行单元测试。

您应该单元测试方法或构造函数的预期输出或与其他对象方法的交互。(交互测试有点“更高级别”,但只有在您发现如何使用Mockito或其他为您处理大部分内容的库之前。)

如果你在构造函数中保留这段代码,你就不能在那里进行任何单元测试,因为它没有副作用——除非你在Suite. value()Rank.value()(我猜都是枚举?)或Card的构造函数中有意想不到的副作用。

甚至堆之前和之后都应该相同,因为所有对象都可能在调用该构造函数后被垃圾回收。

匿名用户

告诉我这是不是你想要的?或者如果不是你想要的,我可以修改

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");
    }
}