3

我正在编写一个 JUnit 测试用例。我想初始化一个列表对象。为简洁起见,让我们初始化一个String对象列表:

public class MyTest {
    @Rule
    public List<MySQLContainer> tests = Arrays.asList(new MySQLContainer("5.5"), new MySQLContainer("5.6"));

    @Test
    public void myTest() {

    }
}

执行时,我收到以下运行时错误:

org.junit.internal.runners.rules.ValidationError: The @Rule 'tests' must implement MethodRule or TestRule.
at org.junit.internal.runners.rules.RuleMemberValidator$FieldMustBeARule.validate(RuleMemberValidator.java:234)
at org.junit.internal.runners.rules.RuleMemberValidator.validateMember(RuleMemberValidator.java:99)
at org.junit.internal.runners.rules.RuleMemberValidator.validate(RuleMemberValidator.java:93)
at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:196)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:1

当我简单地初始化 aMySQLContainer而不是List<MySQLContainer>.

为什么这不起作用?我该如何解决?

我的依赖项中有 JUnit 4.12。

4

3 回答 3

2

尝试使用 ArrayList()

    public List<MySQLContainer> tests = new ArrayList();
于 2018-07-17T20:48:27.090 回答
1

@Rules 用于在每个测试方法之前执行代码。如果您只需要初始化一个成员,请将这个初始化放在一个带有注释的方法中@Before

public class MyTest {    
    private List<MySQLContainer> containers;

    @Before
    public void initContainers() {
        containers =  = Arrays.asList(new MySQLContainer("5.5"), new MySQLContainer("5.6"));
    }

    @Test
    public void myTest() {
        // Some test...    
    }
}
于 2018-07-17T20:48:36.700 回答
0

删除@Rule,一切都很好。

public class MyTest {

    private final List<MySQLContainer> tests = Arrays.asList(
        new MySQLContainer("5.5"),
        new MySQLContainer("5.6")
    );

    @Test
    public void myTest() {

    }
}

@Rule用于 JUnit 4 扩展,可以做一些更复杂的事情。

于 2018-07-18T05:50:39.950 回答