@Before/@BeforeClass似乎无法正常工作,对象指向null。

7
我正在学习JUnit,但是遇到了问题。
在开始之前,我想初始化测试中将要使用的对象。但是@BeforeClass并不能做到这一点。
public class InitTests {
private Croupier croupier;
private Player p1, p2;
@BeforeClass
public void setUp() {
    croupier = new Croupier();
    croupier.PlayersInit(5, 100);
    p1 = croupier.getPlayer(0);
    p2 = croupier.getPlayer(1);
} @Test // p1,p2, croupier = null, have no idea why.
public void PlayerInitTest() {
    assertEquals(0, p1.getId());
    assertEquals(1, p2.getId());
}}

其他类:

public class Player {

private ArrayList<Card> hand = new ArrayList<>();
private int coins = 0;
private static int playerNumber = 0;
private int id;
private boolean inGame = true;

public Player(int coins) {
    this.coins = coins;
    id = ++playerNumber;
}

public int addCoins(int amount) {
    coins+=amount;
    return amount;
}

public int substractCoins(int substract) {
    coins-=substract;
    return substract;
}

public int getCoins() {
    return coins;
}

public int getId() {
    return id;
}

public boolean isInGame() {
    return inGame;
}

public void setGameStatus(boolean status) {
    if(getCoins() < 0 )
        inGame = false;
    else 
        inGame = status;
}

public void clearHand() {
    hand.clear();
}}

public class Croupier {

private String name;
private ArrayList<Card> deck = new ArrayList<>();
private ArrayList<Player> allPlayers = new ArrayList<>();
private ArrayList<Player> actual = new ArrayList<>();
private int stack = 0;
private int bigPlayerStack = 0;
private int smallPlayerStack = 0;

public Croupier() {
    System.out.println("tutej.");
}

public Croupier CroupierInit() {
    // static
    PlayersInit(5, 100);

    return new Croupier();
}

private void CreateDeck() {
    String[] suits = { "hearts", "spades", "diamonds", "clubs" };

    for (int i = 0; i < suits.length; i++)
        for (int j = 2; j < 15; j++)
            deck.add(new Card(j, suits[i]));

}

private void DeckShuffle() {
    Collections.shuffle(deck);
}

public boolean TurnPlayed() {
    if (!preparedGame())
        return false;

    return true;

}

public void StartGame() {
    preparedGame();
    System.out.println("Game ended.");
}

public boolean preparedGame() {
    clearTable();

    if(!setActualPlayers()) 
        return false;

    setSmallAndBig();
    takeFromSmallAndBig();
    CreateDeck();
    DeckShuffle();

    return true;
}

// set players who are playing
public boolean setActualPlayers() {
    for (Player e : allPlayers)
        if (e.isInGame())
            actual.add(e);

    if (actual.size() < 2)
        return false;

    return true;
}

// take coisn from small and big blind
public void takeFromSmallAndBig() {
    stack += actual.get(bigPlayerStack).substractCoins(20);
    stack += actual.get(smallPlayerStack).substractCoins(10);
}

// set who has small or big blind
public void setSmallAndBig() {
    bigPlayerStack++;
    if (bigPlayerStack > actual.size())
        bigPlayerStack = 0;

    smallPlayerStack = bigPlayerStack - 1;

    if(smallPlayerStack < 0 )
        smallPlayerStack = actual.size() -1;
}

// clear table before game
public void clearTable() {
    actual.clear();
    for (Player e : allPlayers)
        e.clearHand();
}

public void PlayersInit(int numberOfPlayers, int coins) {
    for (int i = 0; i < numberOfPlayers; i++) {
        allPlayers.add(new Player(coins));
    }
}

public Player getPlayer(int index) {
    return allPlayers.get(index);
}}

我相信这些测试是正确的,因为当我将setUp方法(该方法中的代码)放入@Test中时,它就可以正常工作。 我希望这只是一个简单的语法问题,作为初学者目前无法解决。
问候。

1
@BeforeClass 方法需要是静态的。对于你这里的情况,请使用 @Before - Andy Turner
1
还是不行 :( - kenik
你使用的是哪个版本的JUnit?我们能看一下@BeforeClass@Test的导入吗? - Alexandre Dupriez
import static org.junit.jupiter.api.Assertions.*;import org.junit.Before;import org.junit.BeforeClass;import org.junit.jupiter.api.Test;import Implementation.Croupier;import Implementation.Player; - kenik
2
好的,所以你混合使用了JUnit 4和5的注释 - 你需要从*.jupiter.*包中导入注释。尝试使用@BeforeEach@BeforeAll,对于后者使用静态方法。(如果您的测试执行,并且使用了Junit 5的@Test进行注释,我假设您的JUnit启动器正在使用版本5。如果不是这种情况或不是您想要的 - 将所有注释还原为JUnit 4)。 - Alexandre Dupriez
你是在Eclipse中运行它们吗?有时,即使你包含了正确版本的junit库,Eclipse也会配置为使用旧版本(junit 3)来运行它。 你可以在这里看到:"右键单击您的项目" > 运行为 > 运行配置 > "您的测试" 在 Junit 下 > 测试运行器:(JUnit 4、3...)。 - Ptiseb
1个回答

25

您的测试类使用了JUnit 4和5注释的混合体。

JUnit 5 API与先前版本的库不兼容,并定义了一组新的注释。假设您的测试执行成功,您可能正在使用JUnit 5启动器,因此需要使用org.junit.jupiter.api包中的注释。

如果您想使用JUnit 5
请尝试使用@org.junit.jupiter.api.BeforeEach@org.junit.jupiter.api.BeforeAll,后者需要使用静态方法。它们的语义在这里定义。

如果您想使用JUnit 4
您需要将所有注释还原为JUnit 4-即使用org.junit.Test
您的JUnit启动器需要配置为JUnit 4。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接