在Groovy类中,@ Rule(JUnit)声明和赋值的逻辑是什么

时间:2013-04-11 07:38:08

标签: java groovy junit junit-rule junit-runner

在groovy文件中尝试一些规则创建变体,我想到了@Rule没有描述DECLARATION,而是ASSIGNMENT。 因此,跑步者在加载测试时会尝试每个规则以进行正确的分配。

//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中的一个错误 - 跑步者在构建测试之前会进行过多的检查。

1 个答案:

答案 0 :(得分:1)

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

如果字段或方法上有@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会忽略这样的注释。