2012-09-23 17 views
5

Ho un numero elevato di casi di test che funzionano con Spring Junit Support con le seguenti annotazioni su ciascun Test.Come creare e utilizzare un'annotazione personalizzata con annotazioni Spring + JUnit Test Config?

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

Invece di mettere tutte queste annotazioni su ogni classe Test Voglio creare un'annotazione personalizzato e utilizzarlo.

@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 { 

} 

Ma quando uso questa Annotazione a molla personalizzata non si verifica affatto.

@SpringJUnit4TestConfig 
public class UserServiceTest 
{ 
} 

Cosa mi manca qui?

PS: Ma JUnit's @RunWith e Spring's @Transactional, @ContextConfiguration hanno tutti @ Inherited.. Così ho pensato che dovrebbe funzionare. Ma per ora lo passo attraverso un lavoro in giro. Crea una classe Abstract Based e metti tutte quelle annotazioni su di essa e i test case che estendono quella classe Base.

+0

Dovrei usare solo @Target ({ElementType.TYPE}) Non penso che lo userete in un campo o parametro, o lo farete? – Koitoer

+0

Hai ragione. Questa annotazione personalizzata dovrebbe essere l'applicazione solo su ElementType.TYPE. –

+0

Anch'io volevo fare esattamente la stessa cosa. Leggendo la domanda e la risposta ho creato un'annotazione che utilizza tutte le configurazioni eccetto '@ RunWith' e sembra che stia funzionando bene finora. Io uso '@RunWith (SpringJUnit4ClassRunner.class)' su ogni classe di TestCase. – ykesh

risposta

2

Non credo che questo approccio funzionerà, dato che @RunWith è annotazione JUnit, quindi per fare questo le annotazioni JUnit devono essere transitive.

Quando una classe viene annotato con @RunWith o estende una classe annotata con @RunWith, JUnit richiamerà la classe fa riferimento per eseguire test di questo classe invece della girante integrato in JUnit. Abbiamo aggiunto questa funzionalità in fase avanzata di sviluppo. Mentre sembra potente, ci aspettiamo che le API runner cambino man mano che impariamo come le persone lo usano davvero. Alcune delle classi attualmente interne saranno probabilmente ridefinite e rese pubbliche.

Così test test JUnit invocando sembrano funzionare solo per le classi ereditate.

quanto per la primavera, supporta una cosa chiamata context configuration inheritance per le posizioni di configurazione, io non sono abbastanza sicuro che questo dovrebbe funzionare per altri tipi di annotazioni (per favore mi punto la documentazione, se si pensa in altro modo) In realtà, questo probabilmente funzionerà con altre annotazioni in caso di ereditarietà della classe di configurazione di test poiché l'annotazione @Transactional viene dichiarata con @Inherited per questo caso.

Quindi, in questo caso, non viene eseguito a causa dell'annotazione di JUnit mancante.

Problemi correlati