Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@Before/@BeforeClass seems not working, objects indicates on null

Tags:

java

junit

i'm learning junit and problem have occured at the beginning.

At the start i want to initialize objected which will be used in tests. But @BeforeClass doesn't do that.

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

Other classes :

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

I'm sure these tests are correct because when i put setUp method ( code from that method) inside @Test it just works. I hope it's a simple syntax problem which as a beginner can't set at the moment.

Greetings.

like image 500
kenik Avatar asked Nov 19 '17 23:11

kenik


People also ask

What is true about @BeforeClass?

@BeforeClass: The @BeforeClass annotated method runs before the execution of test methods in a current class.

What is BeforeClass and afterClass in Junit?

The execution procedure is as follows − First of all, the beforeClass() method executes only once. The afterClass() method executes only once. The before() method executes for each test case, but before executing the test case. The after() method executes for each test case, but after the execution of test case.

What is the difference between before and BeforeEach in Junit?

The code marked @Before is executed before each test, while @BeforeClass runs once before the entire test fixture. If your test class has ten tests, @Before code will be executed ten times, but @BeforeClass will be executed only once.

Does @before run before each test?

Methods annotated with the @Before annotation are run before each test.


1 Answers

Your test class uses a mix of JUnit 4 and 5 annotations.

The JUnit 5 API is not compatible with prior versions of the library, and defines a new set of annotations. Assuming your test executes, you are probably using a JUnit 5 launcher and therefore need to use annotations from org.junit.jupiter.api package.

If you wish to use JUnit 5
Try @org.junit.jupiter.api.BeforeEach or@org.junit.jupiter.api.BeforeAll, with a static method for the latter. Their semantic is defined here.

If you wish to use JUnit 4
You need revert all the annotations to JUnit 4 - which implies using org.junit.Test.
Your JUnit launcher needs to be configured for JUnit 4.

like image 198
Alexandre Dupriez Avatar answered Oct 22 '22 19:10

Alexandre Dupriez