我想编写大量代码的测试用例,我想了解JUnit @Rule
批注功能的详细信息,以便可以将其用于编写测试用例。请提供一些好的答案或链接,通过一个简单的示例详细说明其功能。
我想编写大量代码的测试用例,我想了解JUnit @Rule
批注功能的详细信息,以便可以将其用于编写测试用例。请提供一些好的答案或链接,通过一个简单的示例详细说明其功能。
Answers:
规则用于添加其他功能,这些功能适用于测试类中的所有测试,但以更通用的方式。
例如,ExternalResource在测试方法之前和之后执行代码,而不必使用@Before
和@After
。使用ExternalResource
而不是@Before
和@After
提供机会更好地重用代码;可以在两个不同的测试类中使用相同的规则。
设计基于:JUnit中的拦截器
有关更多信息,请参见JUnit Wiki:规则。
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规则。
这是一个有用的链接供参考:
tl; dr的工作原理:JUnit将测试方法包装在Statement对象中,以便statement.Execute()运行测试。然后,JUnit无需直接调用statement.Execute()来运行测试,而是将带有@Rule批注的Statement传递给TestRule。给定与您的测试一起使用的TestRule的“ apply”函数将返回一个新的Statement。新Statement的Execute()方法可以调用测试Statement的execute方法(是否调用该方法,或多次调用它),以及在执行之前和之后执行的操作。现在,JUnit有了一个新的Statement,它不仅可以运行测试,而且还可以在最终调用Execute之前将其再次传递给任何其他规则。
规则用于以通用方式增强每种测试方法的行为。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提供的一些内置规则的示例。