【问题标题】:How does Junit @Rule work?Junit @Rule 是如何工作的?
【发布时间】:2012-11-21 08:45:39
【问题描述】:

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

【问题讨论】:

  • 我发现this article 很好地解释了@Rules,尤其是最后一节“详细的事件顺序”
  • 我觉得和注射的概念差不多吧?
  • 感谢分享该链接。有一点不清楚。 DEFAULT Statement.evaluate() 什么时候被调用?它是在所有规则的评估()之前调用还是在所有规则之后调用?我猜是所有这些。
  • @testerjoe2 您可以选择完全忽略默认语句。您可以选择委托给它,或者您可以简单地用您自己的其他声明完全替换它。它不会被调用可以调用也可以不调用。这就是第 10 点:“屏幕截图语句的 evaluate() 方法调用了默认语句的 evaluate() 方法。”

标签: java junit junit4 junit-rule


【解决方案1】:

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

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

设计基于:Interceptors in JUnit

欲了解更多信息,请参阅JUnit wiki : Rules

【讨论】:

  • 更正:“例如,ExternalResource 在测试 class 之前和之后执行代码。”有一些关于使用 apply() 让 ExternalResource 在测试之间运行。
  • 阅读this帮助我理解了答案中提到的ExternalResource
【解决方案2】:

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

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

【讨论】:

  • 所以它被删除而不编写任何代码来删除/清除对象?
  • github.com/junit-team/junit4/blob/master/src/main/java/org/…的来源,文件夹是在before()回调方法中创建,在after()回调方法中删除...
  • 对于那些可能不明白为什么删除 TemporaryFolder 的人来说,这是因为它是 Junit 提供的一个 TemporaryFolder,用作自动删除的临时文件夹 - 即拆卸步骤是 TemporaryFolder 类的一部分本身。
【解决方案3】:

它是如何工作的解释:

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

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

【讨论】:

  • 语句有方法评估不执行。
【解决方案4】:

规则用于以通用方式增强每个测试方法的行为。 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");

 }


}

您可以在link 看到 junit 提供的一些内置规则的示例。

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2018-12-03
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多