2011-08-04 54 views
0

我一直在尋找關於如何使用我自己的註釋來擴展JUnit4的資源。創建我自己的註釋以擴展JUnit4行爲

我希望能夠定義一個@ExpectedProblem,我可以用它來標記我的一些測試。我已經看到網上似乎有一些關於如何擴展TestNG的資料,但是我沒有任何可以擴展JUnit4的資料。

有沒有人在這裏擴展過JUnit4?

謝謝

+0

如果使用@ ExpectedProblem,你的意思是你期望測試失敗,你可能會對JUnit @ Rule感興趣,可在以下網址找到:https://github.com/ttsui/pending(免責聲明:這是由我的同事)。 – Grundlefleck

+0

謝謝,但它在任何方面與待定測試無關,也不期望測試失敗。我需要的東西實際上與@Test(期待=異常)類似,但只有一點不同。 –

回答

2

根據什麼你想要你的註釋做@ExpectedProblem,另一種選擇是創建一個@Rule

這需要JUnit 4.7+,但應該比實現自己的Runner更簡單。

例如,如果你想要一個註釋說「這個測試應該拋出一個異常」,那麼你會想看看@ExpectedException規則。即使這不足以滿足您的需求,它也可以爲實施您自己的規則提供一個很好的起點。

+0

規則似乎是一個不錯的想法,直到我看到「這種方法優於規則的優點是規則總是作用域範圍」@ http://stackoverflow.com/questions/6099633/does-testng-support-something-像-junit4s規則/ 6100111#6100111。我需要它們成爲方法範圍(我可能想要1個方法和我的註釋,另一個沒有它!)。 –

+0

@devoured elysium在您的方法規則中,您可以檢查方法中是否存在任何特定的註釋,並且如果註解缺失,讓規則充當noop。 – Grundlefleck

+0

+1在Grundlefleck的評論 @devoured elysium這正是我所要做的 - 在調用我們感興趣的註釋時檢查MethodRule的目標,並基於此修改測試執行。 –

1

基本的方法是創建你自己的類跑步者。例如,通過擴展org.junit.runners.ParentRunnerorg.junit.runners.BlockJUnit4ClassRunner類。然後你會用@RunWith(<your class runner>.class)註釋你的測試類。在你的亞軍,然後你可以分析測試類檢查註釋並採取適當措施等發現這個谷歌搜索:http://tedyoung.me/2011/01/23/junit-runtime-tests-custom-runners/

這是Spring是如何模仿他們的JUnit支持,使用org.springframework.test.context.junit4.SpringJUnit4ClassRunner

+0

謝謝!我只是想問你一些明顯的問題:是不是有一種方法可以避免用笨拙的@RunWith()來污染我所有的測試方法? –

+0

不,AFAIK無法全局配置跑步者。值得注意的是,JUnit本身建議在所有測試類上始終使用@RunWith註釋以確保未來的校樣。如果你的測試類是一個JUnit 4測試,它應該被註釋@RunWith(JUnit4.class)。除非另有說明,當前版本(JUnit 4)默認爲BlockJUnit4ClassRunner。 – pap