[英]How does Junit @Rule work?
我想為大量代碼編寫測試用例,我想了解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。
這是一個有用的鏈接供參考:
其工作原理的解釋:
JUnit 將您的測試方法包裝在 Statement 對象中,因此 statement 和Execute()
運行您的測試。 然后,JUnit 不是直接調用statement.Execute()
來運行測試,而是將 Statement 傳遞給帶有@Rule
注釋的@Rule
。 TestRule 的“apply”函數返回一個新的 Statement 給定帶有您的測試的 Statement。 新的Statement的Execute()
方法可以調用testStatement的execute方法(或者不調用,或者多次調用), before and after
為所欲為。
現在,JUnit 有一個新的 Statement 不僅可以運行測試,而且它可以在最終調用 Execute 之前再次將其傳遞給更多規則。
規則用於以通用方式增強每個測試方法的行為。 Junit 規則攔截測試方法並允許我們在測試方法開始執行之前和測試方法執行之后做一些事情。
例如,使用@Timeout規則,我們可以為所有測試設置超時。
public class TestApp {
@Rule
public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);
......
......
}
@TemporaryFolder規則用於創建臨時文件夾、文件。 每次執行測試方法時,都會創建一個臨時文件夾,並在執行該方法后將其刪除。
public class TempFolderTest {
@Rule
public TemporaryFolder tempFolder= new TemporaryFolder();
@Test
public void testTempFolder() throws IOException {
File folder = tempFolder.newFolder("demos");
File file = tempFolder.newFile("Hello.txt");
assertEquals(folder.getName(), "demos");
assertEquals(file.getName(), "Hello.txt");
}
}
您可以在此鏈接中查看junit 提供的一些內置規則的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.