2017-04-03 88 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來指定規則應該運行的順序。