220

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

4

4 回答 4

163

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

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

设计基于:JUnit 中的拦截器

有关详细信息,请参阅JUnit wiki:规则

于 2012-11-21T08:53:39.190 回答
75

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 Rule。

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

于 2016-01-05T09:27:33.463 回答
25

其工作原理的解释:

JUnit 将您的测试方法包装在一个 Statement 对象 so 语句中并Execute()运行您的测试。然后,JUnit 不是statement.Execute()直接调用来运行您的测试,而是将 Statement 传递给带有@Rule注释的 TestRule。TestRule 的“apply”函数返回一个新的 Statement 给定 Statement 与您的测试。新 Statement 的Execute()方法可以调用 test Statement 的 execute 方法(或不调用,或多次调用),为所欲为before and after

现在,JUnit 有了一个新的 Statement,它不仅仅运行测试,它可以在最终调用 Execute 之前再次将它传递给任何更多规则。

于 2016-06-16T19:45:56.313 回答
2

规则用于以通用方式增强每个测试方法的行为。Junit 规则拦截测试方法并允许我们在测试方法开始执行之前和测试方法执行之后做一些事情。

例如,使用@Timeout规则,我们可以为所有测试设置超时。

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

@TemporaryFolder规则用于创建临时文件夹、文件。每次执行测试方法时,都会创建一个临时文件夹,并在方法执行后将其删除。

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

您可以在此链接中查看 junit 提供的一些内置规则的示例。

于 2020-04-01T16:24:06.840 回答