首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Rule做了什么?

@Rule做了什么?
EN

Stack Overflow用户
提问于 2015-07-23 06:37:16
回答 1查看 813关注 0票数 7

在尝试为单元测试创建临时文件时,我遇到了this answer,其中提到了"TemporaryFolder JUnit @Rule“和一个解释如何使用它的link。它是这样的:

代码语言:javascript
复制
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();

然后是testFolder.newFile("file.txt")

我的问题是@Rule注解是做什么的?

删除注释看起来并不会真正改变任何事情。

EN

回答 1

Stack Overflow用户

发布于 2015-07-23 07:35:16

正如RuleTemporaryFolder的文档所述,它负责在相应类的每个测试方法之前创建一个临时目录,并在每个测试方法之后删除这个临时文件夹(及其内容)。

您可以通过实现TestRuleMethodRule或从其任何实现类(如ExternalResource )进行扩展,轻松地编写自己的规则。

使用@Before@After注释的初始化和清理方法可以保证相同的逻辑。但是,您需要将逻辑添加到test-class中。如果你需要多个测试类中的逻辑,你要么需要使用继承,编写一些任意的实用类,要么将行为具体化。规则通过允许您重用这种初始化或清理逻辑来执行后一种操作,并进一步减少代码并删除不需要的代码,以便将重点放在实际测试上,而不是某些目录或服务器的配置上。

例如,Tomcat声明了两种类型的服务器(Jetty或This project ),您只需使用@Rule进行注释,就可以将服务器用于集成或端到端测试。

如果您只想为所有测试方法初始化一次规则,只需将@Rule替换为@ClassRule,并将规则初始化为public static。这将只初始化类规则一次,并将在每个测试方法中重用。

代码语言:javascript
复制
@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结合使用

代码语言:javascript
复制
@Rule
public RuleChain chain= RuleChain.outerRule(new LoggingRule("outer rule")
                                 .around(new LoggingRule("middle rule")
                                 .around(new LoggingRule("inner rule");

在我们的一个集成测试中,同时向通过Jetty上的Restlet部署的JAX-RS服务发送了几个请求,我们有以下规则定义:

代码语言:javascript
复制
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规则被用来同时执行测试方法几次,以便更早地发现与竞争条件和并发相关的问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31575238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档