在尝试为单元测试创建临时文件时,我遇到了this answer,其中提到了"TemporaryFolder JUnit @Rule“和一个解释如何使用它的link。它是这样的:
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();然后是testFolder.newFile("file.txt")
我的问题是@Rule注解是做什么的?
删除注释看起来并不会真正改变任何事情。
发布于 2015-07-23 07:35:16
正如Rule和TemporaryFolder的文档所述,它负责在相应类的每个测试方法之前创建一个临时目录,并在每个测试方法之后删除这个临时文件夹(及其内容)。
您可以通过实现TestRule或MethodRule或从其任何实现类(如ExternalResource )进行扩展,轻松地编写自己的规则。
使用@Before和@After注释的初始化和清理方法可以保证相同的逻辑。但是,您需要将逻辑添加到test-class中。如果你需要多个测试类中的逻辑,你要么需要使用继承,编写一些任意的实用类,要么将行为具体化。规则通过允许您重用这种初始化或清理逻辑来执行后一种操作,并进一步减少代码并删除不需要的代码,以便将重点放在实际测试上,而不是某些目录或服务器的配置上。
例如,Tomcat声明了两种类型的服务器(Jetty或This project ),您只需使用@Rule进行注释,就可以将服务器用于集成或端到端测试。
如果您只想为所有测试方法初始化一次规则,只需将@Rule替换为@ClassRule,并将规则初始化为public static。这将只初始化类规则一次,并将在每个测试方法中重用。
@ClassRule
public static JettyServerRule server = new JettyServerRule(new EmbeddedJetty());
@Test
public void myUnitTest() {
RestTemplate restTemplate = new RestTemplate();
String url = String.format("http://localhost:%s", server.getPort());
String response = restTemplate.getForObject(url, String.class);
assertEquals("Hello World", response);
}上面的示例只会初始化一次Jetty服务器,测试类的每个测试方法都可以重用这个服务器,而不是为每个方法启动和关闭一个新的服务器。
多个规则甚至可以与RuleChain结合使用
@Rule
public RuleChain chain= RuleChain.outerRule(new LoggingRule("outer rule")
.around(new LoggingRule("middle rule")
.around(new LoggingRule("inner rule");在我们的一个集成测试中,同时向通过Jetty上的Restlet部署的JAX-RS服务发送了几个请求,我们有以下规则定义:
public static SpringContextRule springContextRule;
public static RestletServerRule restletServer;
static {
springContextRule = new SpringContextRule(JaxRsRestletTestSpringConfig.class);
restletServer = new RestletServerRule(springContextRule.getSpringContext());
}
@ClassRule
public static RuleChain ruleChain = RuleChain.outerRule(restletServer).around(springContextRule);
// Tempus Fugit rules
@Rule
public ConcurrentRule concurrently = new ConcurrentRule();
@Rule
public RepeatingRule repeatedly = new RepeatingRule();它在Restlet/Jetty服务器启动以启用spring bean注入之前初始化Spring注释上下文。此外,Tempus Fugit规则被用来同时执行测试方法几次,以便更早地发现与竞争条件和并发相关的问题。
https://stackoverflow.com/questions/31575238
复制相似问题