2017-04-03 86 views
9

我明白,的JUnit @Before VS @rule

  • @Before和分别各试验中,或在整个测试类之前@BeforeClass运行,
  • @Rule@ClassRule包裹每一个测试,或者整个测试类,分别。

比方说,我需要每个测试方法之前初始化一些数据,

如何使用@Before@Rule之间做出选择?在什么情况下比另一个更受欢迎?同样的问题也适用于@BeforeClass@ClassRule

+0

建议可能的重复http://stackoverflow.com/questions/20295578​​,但该问题没有解决何时使用'@ Rule'与'@ Before' – sam

回答

10

为了使用@Rule,您需要一个实现TestRule(首选)或MethodRule的类,如可读取here。 鉴于@Before@After需要在每个测试用例中写入新的方法,@Rule并不是因为它只是一个已经存在的代码的实例。

所以,如果你会使用@Before@AftersetUp()tearDown(),你会使用在很多测试案例,它实际上是一个更好的主意,用的@Rule因为code reuse。如果您有一个测试用例需要唯一的@Before和/或@After,那么这些注释是可取的。

想了解一些更复杂的答案,请看一下几个例子,看看here。 Ajit解释得非常好。

3

事实上,正如@Quwin建议,accoridng到JUnit 4.12 API doc

TestRule可以做到这一点之前能够与@Before@After@BeforeClass,或 @AfterClass注释 方法来做事,但TestRule s为(1)更强大,和(2)项目和类之间更容易共享 。


方式是TestRule s为更强大

有已知的实施TestRule班,其中有一些usefuls规则,你可以使用外的开箱,

有关如何这可能是有用的,看到这些提供TestRules,或写你自己的例子:

  • ErrorCollector:在一个测试方法
  • ExpectedException收集多个错误:做出抛出的异常
  • 灵活断言
  • ExternalResource:启动和停止服务器,例如
  • TemporaryFolder:创建新的文件,删除后测试
  • TestName:记得使用的测试名称的方法
  • TestWatcher期间:在活动方法E过程中添加逻辑xecution
  • Timeout:原因测试的一组时间
  • Verifier后失败:如果对象状态结束了不正确

的规则的另一个好处失败测试,​​是多个规则可以在单一使用测试用例。您可能需要使用RuleChain来指定规则应该运行的顺序。