JUnit @Before vs @Rule

sam*_*sam 29 java junit junit4

我明白那个,

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

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

我如何决定使用@Before@Rule?在什么条件下优先于另一种?同样的问题也无二@BeforeClass对比@ClassRule.

小智 28

要使用@Rule,您需要一个实现TestRule(首选)的类,或者MethodRule可以在这里阅读.然而@Before并且@After要求在每个测试用例中编写新方法,@Rule并不是因为它只是现有代码的实例化.

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

有关几个例子的详细解答,请看一下这里.Ajit解释得非常好.


sam*_*sam 7

实际上,正如@Quwin所建议的那样,根据JUnit 4.12 API文档

TestRule能做到这一点,之前可以用注解的方法来所做的一切@Before@After@BeforeClass,或 @AfterClass,但TestRules为(1)更强大,和(2)项目和类之间更容易地共享。


方法是TestRules为更强大

有的已知实现类TestRule,这些是您可以直接使用的有用规则,

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

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

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