1

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?

Sagar Vaghela
  • 1,165
  • 5
  • 20
  • 38
  • well, you could actually initialise them, instead of only declaring them. What exactly did you expect would happen with the code you've written? – Stultuske Jan 31 '22 at 12:25
  • I want to assign value to @Parameter annotated variable in Junit5 test – Sagar Vaghela Jan 31 '22 at 12:27
  • You can use as approach suggested in above comment or you can initialize it in `@BeforeAll` method – Nisarg Patil Jan 31 '22 at 12:52
  • @NisargPatil, I want to run parameterised test , If I set in `@BeforeAll` this it will not a parameterized test. You can see my Junit 4 example, in this for each data from `primeNumbers` method will initialise global variable and use in parameterised test – Sagar Vaghela Jan 31 '22 at 13:15

2 Answers2

1

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));
}
Nisarg Patil
  • 1,509
  • 1
  • 16
  • 27
0

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));
    }
Rob Spoor
  • 6,186
  • 1
  • 19
  • 20
  • Or you can use ```@ParameterizedTest @CsvSource({"2,true", "6,false", "19,true"}) ``` on your `checkPrime` method – Nisarg Patil Jan 31 '22 at 13:42
  • @NisargPatil I was going to suggest that, but it's a change that's not absolutely necessary. A `CsvSoure`, `MethodSource` or even `ArgumentsSource` with a custom `ArgumentsProvider` can all be used to achieve the same. – Rob Spoor Jan 31 '22 at 13:47