Junit @Rule如何运作?

Dip*_*pak 187 java junit junit4 junit-rule

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

Mat*_*ell 145

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

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

该设计基于:JUnit中的拦截器

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


小智 58

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());
  }
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 所以它删除而不写任何代码来删除/清除对象? (4认同)

Ale*_*lor 14

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

  • 语句具有方法评估未执行。 (2认同)

Har*_*hna 5

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

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

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

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

 }
Run Code Online (Sandbox Code Playgroud)

@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");

 }


}
Run Code Online (Sandbox Code Playgroud)

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