java junit教學 - Junit @Rule如何工作?





30天 (5)


tl; dr它是如何工作的:JUnit將你的測試方法包裝在Statement對像中,所以statement.Execute()運行你的測試。 然後,不要直接調用statement.Execute()來運行測試,JUnit會使用@Rule註釋將Statement傳遞給TestRule。 TestRule的“應用”函數返回一個新的Statement,並在您的測試中給出Statement。 新的Statement的Execute()方法可以調用測試語句的execute方法(或不調用它,或者多次調用它),並且可以在它之前和之後做任何想做的事情。 現在JUnit有一個新的Statement,它不僅僅是運行測試,它還可以在最終調用Execute之前再次將它傳遞給任何更多的規則。

我想為大量代碼編寫測試用例,我想知道JUnit @Rule註釋功能的細節,以便我可以使用它來編寫測試用例。 請提供一些很好的答案或鏈接,通過一個簡單的例子詳細說明其功能。




規則用於添加適用於測試類中所有測試的附​​加功能,但採用更通用的方式。

例如, ExternalResource在測試方法之前和之後執行代碼,而不必使用@Before@After 。 使用ExternalResource而不是@Before@After為更好的代碼重用提供了機會; 可以從兩個不同的測試類中使用相同的規則。

該設計基於: JUnit中的攔截器

有關更多信息,請參閱JUnit wiki:規則




Junit規則的工作原理是AOP(面向方面​​編程)。 它攔截測試方法,從而提供了在執行特定測試方法之前或之後做一些事情的機會。

以下面的代碼為例:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

每次執行上述測試方法時,都會創建一個臨時文件夾,並在執行該方法後將其刪除。 這是Junit提供的開箱即用規則的一個例子。

類似的行為也可以通過創建我們自己的規則來實現。 Junit提供了TestRule接口,可以實現這個接口來創建我們自己的Junit規則。

以下是一些有用的鏈接供參考:




我發現這篇文章很好地解釋了@Rule ,尤其是查看了最後一節“詳細的事件序列”




如果使用@Rule,則該異常集將應用於Test類中的所有測試方法。





java junit junit4 junit-rule