13

我正在创建一个基于 JRE 6 的 Java 应用程序。我使用 JUnit 4 来生成参数化测试。我收到此错误:

注解@Parameterized.Parameters 必须定义属性值

在包含注释的行上:

@Parameterized.Parameters

以下是我认为与此问题相关的代码:

import static org.junit.Assert.assertEquals;

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 calc.CalculatorException;
import calc.ScientificCalculator;

@RunWith(Parameterized.class)
public class ScientificCalculatorTest extends BasicCalculatorTest{

    /** Provides an interface to the scientific features of the calculator under test */
    private ScientificCalculator sciCalc;
    private double a, b;


    @Before
    @Override
    public void setUp() throws Exception {
        sciCalc = new ScientificCalculator();
        //Make sure that the basic functionality of the extended calculator
        //hasn't been broken.
        theCalc = sciCalc;
    }

    /**
     * Constructor. Is executed on each test and sets the test values to each pair in the data sets.
     * @param nr1 the first number in the tested pair.
     * @param nr2 the second number in the tested pair.
     */
    public ScientificCalculatorTest(double nr1, double nr2){
        a = nr1;
        b = nr2;
    }


    @Parameterized.Parameters
    public static Collection<Object[]> testGenerator() {
        return Arrays.asList(new Object[][] {
                //General integer values | -/+ combinations
                {  -100,  -100},
                {  -100,   100},
                {   100,  -100},
                {   100,   100}
        });
    }

我设法找到了一些相关的问题,例如this。可悲的是,在我的情况下,他们没有帮助。

我尝试过但没有奏效的方法:

  • 从类声明中删除“扩展 BasicCalculatorTest”

  • 添加使用 @Test 注解的测试函数

  • 导入 org.junit.runners.Parameterized 并使用 @Parameters 而不是 @Parameterized.Parameters

我需要提一下,我在另一个项目中使用了非常相似的实现(最值得注意的是注释和 testGenerator()),没有任何问题。该实现遵循在线可用的教程,例如thisthisthis

非常感谢任何有关解决此错误的帮助。

4

4 回答 4

2

尝试这个:

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
public class So15213068 {
    public static class BaseTestCase {
        @Test public void test() {
            System.out.println("base class test");
        }
    }
    @RunWith(Parameterized.class) public static class TestCase extends BaseTestCase {
        public TestCase(Double nr1,Double nr2) {
            //super(nr1,nr2);
            this.nr1=nr1;
            this.nr2=nr2;
        }
        @Test public void test2() {
            System.out.println("subclass test "+nr1+" "+nr2);
        }
        @Parameters public static Collection<Object[]> testGenerator() {
            return Arrays.asList(new Object[][]{{-100.,-100.},{-100.,100.},{100.,-100.},{100.,100.}});
        }
        double nr1,nr2;
    }
}

输出:

subclass test -100.0 -100.0
base class test
subclass test -100.0 100.0
base class test
subclass test 100.0 -100.0
base class test
subclass test 100.0 100.0
base class test
于 2013-03-05T04:58:29.333 回答
1

我认为您错过了以下导入。

import org.junit.runners.Parameterized.Parameters;
于 2013-09-09T09:48:54.293 回答
0

一定是因为你扩展了 BaseTestCase。我复制了您的代码,而没有从测试正确运行的基类扩展。

尝试在您的设置中调用 super.setUp()

例如

@Before
@Override
public void setUp() throws Exception {
    super.setUp();
    sciCalc = new ScientificCalculator();
    //Make sure that the basic functionality of the extended calculator
    //hasn't been broken.
    theCalc = sciCalc;
}
于 2013-07-18T14:38:14.193 回答
-1

我遇到了同样的问题,我正在从一个测试超类扩展我的测试,该测试超类有一个用 @org.junit.Before 注释的 init() 方法。
我在子类中实现了一个测试并运行它,到目前为止一切都很好。
然后我想使用参数化的注释来重复测试不同的值,所以我使用@ParameterizedTest 和@ValueSource 并运行测试但它没有工作,因为晚餐类中的初始化方法没有执行。
我覆盖了子类中的 init() 方法并调用了 super.init() 但它不起作用。
一个可行的解决方案是在子类的测试开始时调用 super.init() 。
我认为这是一个兼容性问题,因为每次我在同一个测试类中混合 JUnit4 和 JUnit5 注释时都会发生错误。

于 2019-11-18T12:14:20.753 回答