[Java] Junit @Rule如何工作?


Answers

Junit规则的工作原理是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规则。

以下是一些有用的链接供参考:

Question

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




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