Junit @ Rule如何工作?

我想为大量代码编写testing用例,我想知道JUnit @Rule注释特性的细节,以便我可以使用它来编写testing用例。 请提供一些很好的答案或链接,通过一个简单的例子详细说明其function。

规则用于添加适用于testing类中的所有testing的附加function,但是以更通用的方式。

例如, ExternalResource在testing方法之前和之后执行代码,而不必使用@Before@After 。 使用ExternalResource而不是@Before@After为更好的代码重用提供了机会; 可以从两个不同的testing类中使用相同的规则。

该devise基于: JUnit中的拦截器

有关更多信息,请参阅JUnit wiki:规则 。

Junit规则的工作原理是AOP(面向方面​​编程)。 它拦截testing方法,从而提供了在执行特定testing方法之前或之后做一些事情的机会。

以下面的代码为例:

 public class JunitRuleTest { @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); @Test public void testRule() throws IOException { File newFolder = tempFolder.newFolder("Temp Folder"); assertTrue(newFolder.exists()); } } 

每次执行上述testing方法时,都会创build一个临时文件夹,并在执行该方法后将其删除。 这是Junit提供的开箱即用规则的一个例子。

类似的行为也可以通过创build我们自己的规则来实现。 Junit提供了TestRule接口,可以实现这个接口来创build我们自己的Junit规则。

这里有一些有用的链接供参考:

我发现这篇文章解释了@Rule s,尤其是检查了最后一节“事件序列详细”

tl; dr它是如何工作的:JUnit将你的testing方法包装在Statement对象中,所以statement.Execute()运行你的testing。 然后,而不是直接调用statement.Execute()来运行你的testing,JUnit通过@Rule注解把Statement传递给一个TestRule。 TestRule的“应用”函数返回一个新的语句给你的testing的声明。 新的Statement的Execute()方法可以调用testing语句的execute方法(或不调用它,或者多次调用它),然后在它之前和之后做任何想做的事情。 现在JUnit有一个新的Statement,它不仅仅是运行testing,它还可以在最终调用Execute之前再次传递给更多的规则。