通过@Rule初始化 JUnit 中的列表<?>



我正在编写一个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

当我简单地初始化MySQLContainer而不是List<MySQLContainer>时,我不会得到这样的错误。

为什么不起作用?我该怎么修?

我的依赖项中有JUnit 4.12。

尝试使用ArrayList((

public List<MySQLContainer> tests = new ArrayList();

@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...    
}
}

移除@Rule,一切正常。

public class MyTest {
private final List<MySQLContainer> tests = Arrays.asList(
new MySQLContainer("5.5"),
new MySQLContainer("5.6")
);
@Test
public void myTest() {
}
}

@Rule用于JUnit4扩展,使它可以做一些更复杂的事情。

最新更新