代码之家  ›  专栏  ›  技术社区  ›  jhan

无法解析JUnitParamsRunner

  •  0
  • jhan  · 技术社区  · 1 年前

    我正试图使用Eclipse IDE测试使用JUnitParamsRunner,但不知何故,JUnitParams Runner无法解决。我目前使用的是JDK 21和JUnit 5。这个 @Parameters 无法解析为类型,而相同的情况也适用于 @RunWith(JUnitParamsRunner.class)

    这是我的JUnit测试代码

    package application;
    import junitparams.JUnitParamsRunner;
    import junitparams.Parameters;
    
    import static junitparams.JUnitParamsRunner.$;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import static org.junit.Assert.assertEquals;
    
    @RunWith(JUnitParamsRunner.class)
    public class BasicParameterizedDemo {
    
        @Test
        public void testAddTwoNumbersV1() {
            VariousMethodsClass vmc = new VariousMethodsClass();
            int result = vmc.addTwoNumbers(10, 15);
            assertEquals(25, result);
        }
        
        @Test
        public void testAddTwoNumbersV2() {
            VariousMethodsClass vmc = new VariousMethodsClass();
            int result = vmc.addTwoNumbers(-50, 10);
            assertEquals(-40, result);
        }
        
        @Test
        public void testAddTwoNumbersV3() {
            VariousMethodsClass vmc = new VariousMethodsClass();
            int result = vmc.addTwoNumbers(30, 100);
            assertEquals(130, result);
        }
    
        @Test
        @Parameters({"10, 15, 25","-50, 10, -40","30, 100, 130"})
        public void paramTestAddTwoNumbersV1(int num1, int num2, int expectedSum) {
            VariousMethodsClass vmc = new VariousMethodsClass();
            int result = vmc.addTwoNumbers(num1, num2);
            assertEquals(expectedSum, result);
        }   
        
        private Object[] getNumbersToAdd() {
            
            return new Object[] {
                new Object[] {10, 15, 25},
                new Object[] {-50, 10, -40},
                new Object[] {30, 100, 130}
            };
        }
        
        @Test
        @Parameters(method = "getNumbersToAdd")
        public void paramTestAddTwoNumbersV2(int num1, int num2, int expectedSum) {
            VariousMethodsClass vmc = new VariousMethodsClass();
            int result = vmc.addTwoNumbers(num1, num2);
            assertEquals(expectedSum, result);
        }
        
        @Test
        @Parameters
        public void paramTestV3(int num1, int num2, int expectedSum){
            VariousMethodsClass vmc = new VariousMethodsClass();
            assertEquals(expectedSum,vmc.addTwoNumbers(num1, num2));
        }
        
        private Object[] parametersForParamTestV3(){
            return new Object[] {
                    new Object[] {10, 15, 25},
                    new Object[] {-50, 10, -40},
                    new Object[] {30, 100, 130}
            };
        }
        
        @Test
        @Parameters(method = "getNumbersToAdd_V2")
        public void paramTestV4(int num1, int num2, int expectedSum){
            VariousMethodsClass vmc = new VariousMethodsClass();
            assertEquals(expectedSum, vmc.addTwoNumbers(num1, num2));
        }
        
        private Object[] getNumbersToAdd_V2(){
            return $(
                    $(10, 15, 25),
                    $(-50, 10, -40),
                    $(30, 100, 130)
            );
        }
    }```
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Thomas Kläger    1 年前

    你的进口( org.junit.Test org.junit.runner.RunWith )来自JUnit 4( https://github.com/junit-team/junit4/wiki/Getting-started )JUnit4本身并不支持参数化测试。对于JUnit 4,有一个单独的包 JUnitParams 你没有导入到你的项目中。

    如果您想使用JUnit5,您需要从导入正确的 Test 注释( https://junit.org/junit5/docs/current/user-guide/#writing-tests ):

    import org.junit.jupiter.api.Test;
    

    您需要更改参数化测试以使用本机JUnit5参数化测试支持( https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests ):

    import org.junit.jupiter.params.ParameterizedTest
    
        @ParameterizedTest
        @CsvSource({"10, 15, 25","-50, 10, -40","30, 100, 130"})
        public void paramTestAddTwoNumbersV1(int num1, int num2, int expectedSum) {
            VariousMethodsClass vmc = new VariousMethodsClass();
            int result = vmc.addTwoNumbers(num1, num2);
            assertEquals(expectedSum, result);
        }   
     
        private Object[] getNumbersToAdd() {
            return new Object[] {
                new Object[] {10, 15, 25},
                new Object[] {-50, 10, -40},
                new Object[] {30, 100, 130}
            };
        }
    
        @ParameterizedTest
        @MethodSource("getNumbersToAdd")
        public void paramTestAddTwoNumbersV2(int num1, int num2, int expectedSum) {
            VariousMethodsClass vmc = new VariousMethodsClass();
            int result = vmc.addTwoNumbers(num1, num2);
            assertEquals(expectedSum, result);
        }
    
        @ParameterizedTest
        @MethodSource
        public void paramTestV3(int num1, int num2, int expectedSum){
            VariousMethodsClass vmc = new VariousMethodsClass();
            assertEquals(expectedSum,vmc.addTwoNumbers(num1, num2));
        }
    
        private Object[] parametersForParamTestV3(){
            return new Object[] {
                new Object[] {10, 15, 25},
                new Object[] {-50, 10, -40},
                new Object[] {30, 100, 130}
            };
        }
    

    我省略了最后一个例子,因为JUnit5不支持 $() 用于写入阵列。