我理解,
@Before
和@BeforeClass
分别在每个测试或整个测试类之前运行@Rule
和@ClassRule
分别包装每个测试或整个测试类。假设我需要在每种测试方法之前初始化一些数据,
如何决定使用@Before
和@Rule
?在什么条件下优先于另一个?同样的问题也适用于@BeforeClass
vs。@ClassRule
。
答案 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
来指定应运行规则的顺序。