junit规则_JUnit规则
junit規(guī)則
介紹
在本文中,我想展示一個示例,說明如何使用JUnit Rule簡化測試。
最近,我繼承了一個相當(dāng)復(fù)雜的系統(tǒng),并未對所有內(nèi)容進(jìn)行測試。 甚至經(jīng)過測試的代碼也很復(fù)雜。 通常,我看到缺乏測試隔離。 (我將寫一個關(guān)于使用Legacy Code的不同博客)。
我正在修復(fù)的測試(和代碼)之一實際上是將多個組件一起測試。 它還連接到數(shù)據(jù)庫。 它測試一些邏輯和組件之間的交集。 如果代碼沒有在完全不同的位置編譯,則測試無法運行,因為它加載了所有Spring上下文。 其結(jié)構(gòu)是在測試(任何類)之前啟動所有Spring上下文。 這些測試擴展了BaseTest,該加載了所有Spring上下文。
BaseTest還使用@After方法清除數(shù)據(jù)庫。
重要說明:本文是關(guān)于更改測試的,并非結(jié)構(gòu)完全正確。 在創(chuàng)建新代碼和測試時,應(yīng)該將它們隔離,一事不做。更好的測試應(yīng)該使用模擬數(shù)據(jù)庫/依賴項等。修復(fù)測試和重構(gòu)后,我將充滿信心進(jìn)行更多更改。
回到我們的話題…
因此,我得到的是測試套件運行緩慢,沒有隔離,甚至由于不相關(guān)的問題而導(dǎo)致測試運行出現(xiàn)問題。 因此,我決定將數(shù)據(jù)庫連接的上下文加載與清理數(shù)據(jù)庫分開。
方法
為了實現(xiàn)這一點,我做了三件事:首先是更改測試類的繼承。 它停止繼承BaseTest。 相反,它繼承了AbstractJUnit4SpringContextTests現(xiàn)在,我可以為每個測試創(chuàng)建自己的上下文,而不加載所有內(nèi)容。
現(xiàn)在我需要兩個規(guī)則,@ClassRule和@Rule @ClassRule將負(fù)責(zé)數(shù)據(jù)庫連接@Rule將在每次測試之后/之前清理數(shù)據(jù)庫。
但是首先, 什么是JUnit規(guī)則?
簡短的解釋是,它們提供了攔截測試方法的可能性,類似于AOP概念。 @Rule允許我們在方法實際運行之前和之后攔截方法。 @ClassRule攔截測試類的運行。 一個非常有名的@Rule是JUnit的TemporaryFolder 。
(類似于@ Before,@ After和@BeforeClass)。
創(chuàng)建@Rule
最簡單的部分是創(chuàng)建一個在測試方法之前和之后清理數(shù)據(jù)庫的規(guī)則。 您需要實現(xiàn)TestRule ,它具有一種方法: 語句apply(Statement base,Description description); 你可以做很多。 我發(fā)現(xiàn)通常我會有一個擴展Statement的內(nèi)部類。 我創(chuàng)建的規(guī)則并未創(chuàng)建數(shù)據(jù)庫連接,而是在構(gòu)造函數(shù)中獲得了它。
這是完整的代碼:
public class DbCleanupRule implements TestRule {private final DbConnectionManager connection;public MongoCleanupRule(DbConnectionManager connection) {this.connection = connection;}@Overridepublic Statement apply(Statement base, Description description) {return new MongoCleanupStatement(base, connection);}private static final class DbCleanupStatement extends Statement {private final Statement base;private final DbConnectionManager connection;private MongoCleanupStatement(Statement base, DbConnectionManager connection) {this.base = base;this.connection = connection;}@Overridepublic void evaluate() throws Throwable {try {cleanDb();base.evaluate();} finally {cleanDb();}}private void cleanDb() {connection.doTheCleanup();}} }創(chuàng)建@ClassRule
ClassRule實際上也是TestRule。 與Rule的唯一區(qū)別是我們在測試代碼中如何使用它。 我將在下面顯示。
創(chuàng)建此規(guī)則的挑戰(zhàn)在于,我想使用Spring上下文來獲取正確的連接。
這是代碼:
(ExternalResource是TestRule)
(您是否看到我可以使DbCleanupRule繼承ExternalResource?)
使用它
最后一部分是我們?nèi)绾问褂靡?guī)則。 @Rule必須是公共字段。 @ClassRule必須是公共靜態(tài)字段。
那里是:
@ContextConfiguration(locations = { "/META-INF/one-dao-TEST-ctx.xml", "/META-INF/two-TEST-ctx.xml" }) public class ExampleDaoTest extends AbstractJUnit4SpringContextTests {@ClassRulepublic static DbCleanupRule connectionRule = new DbCleanupRule ();@Rulepublic DbCleanupRule dbCleanupRule = new DbCleanupRule(connectionRule.getDbConnecttion()); @Autowiredprivate ExampleDao classToTest;@Testpublic void foo() {} } 就這樣。
希望能幫助到你。
翻譯自: https://www.javacodegeeks.com/2014/09/junit-rules-3.html
junit規(guī)則
總結(jié)
以上是生活随笔為你收集整理的junit规则_JUnit规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加号是什么快捷键(加减号的快捷键)
- 下一篇: Kubernetes集群上的Apache