How to parameterize junit Test Suite

后端 未结 7 1965
梦毁少年i
梦毁少年i 2021-01-14 06:42

Is it possible to parameterize a TestSuite in junit 4 ?

For declaring a class as a test suite I need the annotation @RunWith(Suite.class), but the same

7条回答
  •  半阙折子戏
    2021-01-14 07:11

    I believe the basic answer is No, because as you said, the @RunsWith only take one parameter. I found a blog posting that got a bit creative in how to handle this situation.

    We don't use the parameterized tests, but may you could create a separate suite like we do that only lists the test classes and the parameterized test could be part of that. I modified our test suite to include a parameterized test class to part of the suite and it ran fine. We create our suite like below where PrimeNumberCheckerTest was a simple I pulled from the web.

    package com.jda.portfolio.api.rest.server;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({  com.mycompany.api.rest.server.resource.TestCartResourceJava.class, 
                     com.mycompany.api.rest.server.resource.TestCustomerResource.class,
                     com.mycompany.api.rest.server.resource.TestWizardProfileResource.class,
                     com.mycompany.api.rest.server.interceptor.TestBaseSearchInterceptor.class, 
                     com.mycompany.api.rest.server.resource.TestQueryParameters.class, 
                     com.mycompany.api.rest.server.expression.TestCartExpressionGenerator.class, 
                     com.mycompany.api.rest.server.expression.TestPreferenceExpressionGenerator.class, 
                     com.mycompany.api.rest.server.PrimeNumberCheckerTest.class, 
                     })
    public class AllTests {}
    

    Here's the source for the parameterized test case;

    package com.jda.portfolio.api.rest.server:
    
    import static org.junit.Assert.*;
    import java.util.Arrays;
    import java.util.Collection;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Parameterized.class)
    @SuiteClasses({PrimeNumberCheckerTest.class})
    public class PrimeNumberCheckerTest {
      private Integer inputNumber;
      private Boolean expectedResult;
      private PrimeNumberChecker primeNumberChecker;
    
      @Before
      public void initialize() {
         primeNumberChecker = new PrimeNumberChecker();
      }
    
      // Each parameter should be placed as an argument here
      // Every time runner triggers, it will pass the arguments
      // from parameters we defined in primeNumbers() method
      public PrimeNumberCheckerTest(Integer inputNumber, 
         Boolean expectedResult) {
         this.inputNumber = inputNumber;
         this.expectedResult = expectedResult;
      }
    
      @Parameterized.Parameters
      public static Collection primeNumbers() {
         return Arrays.asList(new Object[][] {
            { 2, true },
            { 6, false },
            { 19, true },
            { 22, false },
            { 23, true }
         });
      }
    
      // This test will run five times since we have as many parameters defined
      @Test
      public void testPrimeNumberChecker() {
         System.out.println("Parameterized Number is : " + inputNumber);
         assertEquals(expectedResult, 
         primeNumberChecker.validate(inputNumber));
      }
    

提交回复
热议问题