1

尝试在 groovy 文件中创建规则的一些变体,我想到@Rule 不描述声明,而是描述分配。因此,跑步者在加载测试时,会尝试每条规则以正确分配。

//Correct variants:
@Rule
public ErrorCollector collector1= new ErrorCollector();

public ErrorCollector collector2= null;
@Rule
collector2= new ErrorCollector();

public ErrorCollector collector3;
@Rule
collector3= new ErrorCollector();


// incorrect variants:
@Rule
public ErrorCollector collector4= null;

@Rule
public ErrorCollector collector5;

@Rule
public ErrorCollector collector5=somethingThatIsNotRule;

@Rule
public ErrorCollector collector5=anotherRule;

但是,后来我遇到了一些自相矛盾的变体:

//these lines are not only taken by the runner, but also passed without errors:
public ErrorCollector collector6;
{
  @Rule
  collector6= null;
}

public ErrorCollector collector7=null;
{
  @Rule
  collector7= null;
}

它的逻辑是什么?

这似乎是 Runner 中的一个错误 - runner 在构建测试之前进行了过多的检查。

4

1 回答 1

1

在 Java 中,JUnit 运行器检查@Rule注释是否应用于公共非静态字段或返回TestRuleMethodRule的公共非静态方法。

如果@Rule字段或方法上有注释,则该值必须是非空值,否则您将在执行测试期间收到 NullPointerException。

您的示例比这更复杂,因为 Groovy 是一种动态语言,因此它在运行时而不是编译时进行检查。我怀疑collector2 和collector3 实际上并没有做任何事情。@Rule注释不适用于该字段。

collector4 => NullPointerException
collector5 => same as collector5
collector5a => when you execute, I suspect Groovy doesn't find the
               expected methods on your somethingThatIsNotRule, or
               you're getting a ClassCastException or something similar.
collector5b => same as 5b for anotherRule

同样,对于您的悖论,@Rule注释实际上并未应用于该领域。

我怀疑您的困惑来自这样一个事实,即 Groovy 不会抱怨在@Rule不是字段或方法的东西上的使用(而 Java 会)。它可能不会抱怨,但 JUnit 会忽略这样的注释。

于 2013-04-11T14:00:21.723 回答