在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中的一个错误 - 跑步者在构建测试之前会进行过多的检查。
答案 0 :(得分:1)
在Java中,JUnit运行器检查@Rule
注释是否应用于公共非静态字段或公共非静态方法,该方法返回TestRule或MethodRule。< / 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会忽略这样的注释。