【问题标题】:how can I initialise global variable of class in Junit 5?如何在 Junit 5 中初始化类的全局变量?
【发布时间】:2022-01-31 12:23:23
【问题描述】:

我正在将 Junit 4 升级到 Junit 5,并希望将参数化测试从 Junit4 转换为 Junit5,但面临以下问题。

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

我想在 Junit 5 中做同样的事情,并更改代码如下。


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

但它并没有初始化全局变量inputNumberexpectedResult,这里都是null。如果我提供这两个作为测试方法的参数,那么它就可以工作。

但是如果我有多个参数怎么办,有什么办法吗?

我可以用什么来代替@Parameter

【问题讨论】:

  • 好吧,您实际上可以初始化它们,而不仅仅是声明它们。您所编写的代码究竟会发生什么?
  • 我想在Junit5测试中给@Parameter注解变量赋值
  • 您可以使用上述评论中建议的方法,也可以在@BeforeAll方法中初始化它
  • @NisargPatil,我想运行参数化测试,如果我在@BeforeAll 中设置它不会是参数化测试。您可以查看我的 Junit 4 示例,在此 primeNumbers 方法中的每个数据将初始化全局变量并在参数化测试中使用

标签: java testing junit junit4 junit5


【解决方案1】:

下面的代码应该可以工作,但还没有测试过

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

【讨论】:

    【解决方案2】:

    你快到了。诀窍在于,使用 JUnit 5 的 ParameterizedTest,参数化的不是类而是方法:

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

    【讨论】:

    • 或者你可以在你的checkPrime方法上使用@ParameterizedTest @CsvSource({"2,true", "6,false", "19,true"})
    • @NisargPatil 我打算这样做,但这是一个并非绝对必要的更改。 CsvSoureMethodSource 甚至是带有自定义 ArgumentsProviderArgumentsSource 都可以用来实现相同的目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多