我明白,
@Before和@BeforeClass分别在每个测试或整个测试类之前运行。@Rule和@ClassRule分别包装每个测试或整个测试类。假设我需要在每个测试方法之前初始化一些数据,
如何在使用@Before 和 @Rule**?之间作出决定?在什么情况下,一种比另一种更可取?**同样的问题也适用于@BeforeClass和@ClassRule。
发布于 2017-04-04 00:57:37
为了使用@Rule,您需要一个实现TestRule(首选)或MethodRule的类,可以读取这里。虽然@Before和@After需要在每个测试用例中编写一个新的方法,但是@Rule并不是因为它只是已经存在的代码的实例化。
因此,如果您在许多测试用例中将@Before和@After用于setUp()和tearDown(),那么使用@Rule实际上是一个更好的主意,因为有code reuse。如果您有一个需要唯一的@Before和/或@After的测试用例,那么这些注释更好。
关于几个例子的更详细的答案,请看一下这里。阿吉特解释得很好。
发布于 2017-04-04 15:41:32
的确,正如@Quwin所建议的,根据JUnit 4.12 API文档的说法,
TestRule可以完成以前可以用@Before、@After、@BeforeClass或@AfterClass注释的方法完成的所有任务,但是TestRule的(1)更强大,(2)更容易在项目和类之间共享。
TestRule更强大的方式
有一些已知的TestRule实现类,它们是一些有用的规则,您可以开箱即用,
有关这方面如何有用的示例,请参阅这些提供的TestRules,或编写您自己的:
ErrorCollector:在一个测试方法中收集多个错误ExpectedException:对抛出的异常进行灵活的断言ExternalResource:启动和停止服务器,例如TemporaryFolder:创建新文件,并在测试后删除TestName:记住在方法中使用的测试名称TestWatcher:在方法执行期间在事件中添加逻辑Timeout:导致测试在设定时间后失败Verifier:如果对象状态不正确,则失败测试规则的另一个好处是可以在一个测试用例中使用多个规则。您可能希望使用RuleChain来指定运行规则的顺序。
https://stackoverflow.com/questions/43193188
复制相似问题