JUnit @Before vs @Rule

时间:2017-04-03 19:54:56

标签: java junit junit4

我理解,

  • @Before@BeforeClass分别在每个测试或整个测试类之前运行
  • @Rule@ClassRule分别包装每个测试或整个测试类。

假设我需要在每种测试方法之前初始化一些数据,

如何决定使用@Before@Rule?在什么条件下优先于另一个?同样的问题也适用于@BeforeClass vs。@ClassRule

2 个答案:

答案 0 :(得分:24)

要使用@Rule,您需要一个实现TestRule(首选)或MethodRule的类,可以阅读here。 鉴于@Before@After需要在每个测试用例中编写新方法,@Rule不会,因为它只是现有代码的实例化。

因此,如果您将@Before@After用于许多测试用例中的setUp()tearDown(),那么实际上更好的做法是因@Rule而使用code reuse。如果您的测试用例需要唯一的@Before和/或@After,则最好使用这些注释。

有关几个示例的更详细的回答,请查看here。 Ajit解释得非常好。

答案 1 :(得分:4)

确实,正如@Quwin所建议的那样,符合JUnit 4.12 API doc

  

TestRule可以完成之前可以完成的所有操作   使用@Before@After@BeforeClass或注释的方法   @AfterClass,但TestRule (1)更强大(2)更容易分享   在项目和课程之间。

TestRule 的方法

TestRule的已知实现类,这些是您可以立即使用的一些有用的规则,

  

有关如何使用它的示例,请参阅这些提供的TestRules,或编写自己的:

     
      
  • ErrorCollector:在一个测试方法中收集多个错误
  •   
  • ExpectedException:对抛出的异常做出灵活的断言
  •   
  • ExternalResource:启动和停止服务器,例如
  •   
  • TemporaryFolder:创建新文件,并在测试后删除
  •   
  • TestName:记住方法
  • 中使用的测试名称   
  • TestWatcher:在方法执行期间在事件中添加逻辑
  •   
  • Timeout:在一段时间后导致测试失败
  •   
  • Verifier:如果对象状态不正确
  • ,则测试失败   

规则的另一个好处是可以在单个测试用例中使用多个规则。您可能希望使用RuleChain来指定应运行规则的顺序。