Junit @Rule如何运作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Junit @Rule如何运作?相关的知识,希望对你有一定的参考价值。

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

答案

规则用于添加适用于测试类中所有测试的其他功能,但是以更通用的方式。

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

设计基于:Interceptors in JUnit

有关更多信息,请参阅JUnit wiki : Rules

另一答案

Junit Rules的工作原理是AOP(面向方面​​编程)。它截取测试方法,从而提供在执行特定测试方法之前或之后执行某些操作的机会。

以下面的代码为例:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

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

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

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

这是一个有用的链接供参考:

另一答案

我发现this article很好地解释了@Rules,特别是查看了最后一节“详细事件的顺序”

另一答案

tl; dr是如何工作的:JUnit将您的测试方法包装在Statement对象中,因此statement.Execute()运行您的测试。然后,JUnit不直接调用statement.Execute()来运行测试,而是使用@Rule注释将Statement传递给TestRule。 TestRule的“apply”函数返回一个新的Statement,在您的测试中给出Statement。新的Statement的Execute()方法可以调用测试语句的执行方法(或不调用,或多次调用),并在之前和之后做任何想做的事情。现在JUnit有一个新的Statement,它不仅仅运行测试,它还可以在最终调用Execute之前再将它传递给任何更多的规则。

以上是关于Junit @Rule如何运作?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JUnit TemporaryFolder @Rule 与 Spring @Value 属性一起使用?

Junit 外部资源@Rule 顺序

为啥 JUnit 中的 @Rule 注释字段必须是公开的?

Junit @Rule 和 @ClassRule

JUnit的Rule的使用

使用java.lang.Exception的错误:测试类应该只有一个公共构造函数