我想为大量的代码编写测试用例,我希望了解JUnit@Rule
注解特性的详细信息,以便我可以使用它来编写测试用例。请提供一些好的答案或链接,通过简单的示例详细描述其功能。
我想为大量的代码编写测试用例,我希望了解JUnit@Rule
注解特性的详细信息,以便我可以使用它来编写测试用例。请提供一些好的答案或链接,通过简单的示例详细描述其功能。
规则被用来为测试类中的所有测试添加额外的功能,但以一种更通用的方式应用于所有测试。
例如,ExternalResource可以在测试方法之前和之后执行代码,无需使用@Before
和@After
。使用ExternalResource
而不是@Before
和@After
可以更好地重用代码;相同的规则可以从两个不同的测试类中使用。
这个设计是基于:JUnit中的拦截器
有关更多信息,请参见JUnit wiki : Rules。
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规则。
以下是一个参考链接:
它的工作原理如下:
JUnit会将您的测试方法封装在一个Statement对象中,使该语句和Execute()
运行您的测试。然后,JUnit不直接调用statement.Execute()
来运行您的测试,而是将Statement与@Rule
注释一起传递给TestRule。TestRule的“apply”函数返回一个新的Statement,给出带有您的测试的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");
}
}
@Rule
,特别是请注意最后一节“详细的事件序列”。 - Peter Perháč