2012-09-23 101 views
5

我有大量的測試用例與Spring Junit支持一起運行,每個測試都有以下注釋。如何創建和使用具有Spring + JUnit測試配置註釋的自定義註釋?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:spring/applicationContext.xml") 
@TransactionConfiguration(transactionManager="transactionManager") 
@Transactional 
@ActiveProfiles("test") 

而不是將所有這些註釋放在每個Test類上我想創建一個自定義註釋並使用它。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:spring/applicationContext.xml") 
@TransactionConfiguration(transactionManager="transactionManager") 
@Transactional 
@ActiveProfiles("test") 

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
public @interface SpringJUnit4TestConfig { 

} 

但是,當我使用此自定義註釋彈簧注射根本沒有發生。

@SpringJUnit4TestConfig 
public class UserServiceTest 
{ 
} 

我在這裏失蹤了什麼?

PS: 但JUnit的@RunWith和Spring的@Transactional,@ContextConfiguration都具有@繼承。所以我認爲它應該工作。但現在我通過解決方案來解決它。創建一個基於抽象的類,並將所有這些註釋和測試用例擴展到該基類。

+0

我應該只使用@Target({ElementType.TYPE})我不認爲你會在字段或參數中使用它,或者你會嗎? – Koitoer

+0

你說得對。此自定義註釋應該僅在ElementType.TYPE上應用。 –

+0

我也想做完全一樣的。閱讀問題和答案我創建了一個使用除'@ RunWith'之外的所有配置的註釋,並且目前看起來運行良好。我在每個TestCase類上使用'@RunWith(SpringJUnit4ClassRunner.class)'。 – ykesh

回答

2

我不認爲這種方法會起作用,因爲@RunWith是JUnit註釋,因此爲了實現這個功能,JUnit註釋必須是可傳遞的。

當一個類被註解爲@RunWith或延長使用@RunWith註釋的類,JUnit會調用它引用運行在類,而不是內置的JUnit亞軍測試的類。我們在開發的後期增加了這個功能。雖然看起來很強大,但我們希望跑步者API能夠在我們瞭解人們真正使用它的過程中發生變化。目前內部的一些課程可能會被完善並公開。

因此,測試JUnit測試調用似乎只適用於繼承類。

至於春天,它支持的配置位置稱爲context configuration inheritance的事情, 我非常不知道這應該對其他註釋類型的工作(請點我的文檔,如果你認爲其他) 其實,這在測試配置類繼承的情況下可能適用於其他註釋,因爲@Transactional註釋本身在此情況下用@Inherited聲明。

因此,在這種情況下,由於缺少JUnit註釋,它不會運行。