Sagar Vaghela
Sagar Vaghela

Reputation: 1263

how can I initialise global variable of class in Junit 5?

I am upgrading Junit 4 to Junit 5 and want to convert parameterized test from Junit4 to Junit5, but facing below issue.

@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {

   @Parameter(0)
   private Integer inputNumber;
   @Parameter(1)
   private Boolean expectedResult;
   private PrimeNumberChecker primeNumberChecker;

   @Before
   public void initialize() {
      primeNumberChecker = new PrimeNumberChecker();
   }

      @Parameterized.Parameters
      public static Collection primeNumbers() {
      return Arrays.asList(new Object[][] {
         { 2, true },
         { 6, false },
         { 19, true },
         { 22, false },
         { 23, true }
      });
   }
 
   @Test
   public void checkPrime(){
      assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
   }

I would like to do same thing in Junit 5, and changed code as below.


public class PrimeNumberCheckerTest {

   @Parameter(0)
   private Integer inputNumber;
   @Parameter(1)
   private Boolean expectedResult;
   private PrimeNumberChecker primeNumberChecker;

   @BeforeAll
   public void initialize() {
      primeNumberChecker = new PrimeNumberChecker();
   }

      
      public static Collection primeNumbers() {
      return Arrays.asList(new Object[][] {
         { 2, true },
         { 6, false },
         { 19, true },
         { 22, false },
         { 23, true }
      });
   }
 
   @ParameterizedTest
   @MethodSource("primeNumbers")
   public void checkPrime(){
      assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
   }

But it does not initialise the global variables inputNumber and expectedResult, both are null here. If I provide these two as argument of the test method then it works.

But what if I have numbers of parameter, is there any way?

what can I use instead of @Parameter?

Upvotes: 1

Views: 2685

Answers (2)

Nisarg Patil
Nisarg Patil

Reputation: 1639

Below code should work, haven't tested it though

@ParameterizedTest
@CsvSource({"2,true", "6,false", "19,true"})
public void checkPrime(int inputNumber, boolean expetedResult){
    assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
}

Upvotes: 1

Rob Spoor
Rob Spoor

Reputation: 9110

You're almost there. The trick is that with JUnit 5's ParameterizedTest, it's not the class that's parameterized but the method:

public class PrimeNumberCheckerTest {

    private PrimeNumberChecker primeNumberChecker;

    @BeforeAll
    public void initialize() {
        primeNumberChecker = new PrimeNumberChecker();
    }
          
    public static Collection primeNumbers() {
        return Arrays.asList(new Object[][] {
                { 2, true },
                { 6, false },
                { 19, true },
                { 22, false },
                { 23, true }
        });
    }
 
    @ParameterizedTest
    @MethodSource("primeNumbers")
    public void checkPrime(int inputNumber, boolean expetedResult){
        assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
    }

Upvotes: 0

Related Questions