2012-09-23 38 views
5

Tengo una gran cantidad de casos de prueba que se ejecutan con Spring Junit Support con las siguientes anotaciones en cada prueba.Cómo crear y utilizar una anotación personalizada que tenga anotaciones Spring + JUnit Test Config?

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

En lugar de poner todas estas anotaciones en cada clase de prueba que desea crear una anotación personalizada y utilizarlo.

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

} 

Pero cuando uso este Custom Annotation Spring Injection no sucede en absoluto.

@SpringJUnit4TestConfig 
public class UserServiceTest 
{ 
} 

¿Qué es lo que me falta falta aquí?

PD: Pero JUnit's @RunWith y Spring's @Transactional, @ContextConfiguration tienen @ Heredado ... Así que pensé que debería funcionar. Pero por ahora lo supero con un trabajo completo. Creó una clase de Resumen Basado y puso todas esas Anotaciones en ella y los casos de prueba extendiendo esa clase Base.

+0

Debo usar solo @Target ({ElementType.TYPE}) No creo que vayas a usar esto en un campo o parámetro, ¿o sí? – Koitoer

+0

Tienes razón. Esta anotación personalizada debe ser solo aplicación en ElementType.TYPE. –

+0

Yo también quería hacer exactamente lo mismo. Al leer la pregunta y la respuesta, creé una anotación que usa todas las configuraciones excepto '@ RunWith' y parece estar funcionando bien hasta ahora. Yo uso '@RunWith (SpringJUnit4ClassRunner.class)' en cada clase TestCase. – ykesh

Respuesta

2

No creo que este enfoque funcione, ya que @RunWith es una anotación JUnit, por lo tanto, para que esto funcione, las anotaciones JUnit deben ser transitivas.

Cuando una clase se anota con @RunWith o se extiende una clase anotada con @RunWith, JUnit invocará la clase que hace referencia a ejecutar las pruebas de esa clase en lugar del corredor integrado en JUnit. Agregamos esta característica al final del desarrollo. Si bien parece poderoso, esperamos que la API del corredor cambie a medida que aprendamos cómo la gente realmente la usa. Algunas de las clases que actualmente son internas probablemente se refinarán y se harán públicas.

Así que la prueba JUnit invocación de prueba parece funcionar solo para las clases heredadas.

En cuanto a la primavera, que es compatible con una cosa llamada context configuration inheritance para las ubicaciones de configuración, Estoy totalmente no estoy seguro de que esto debería funcionar para otros tipos de anotaciones (por favor, que me señale la documentación, si se piensa lo contrario) En realidad, este probablemente funcionará para otras anotaciones en el caso de la herencia de la clase de configuración de prueba porque la anotación @Transactional misma se declara con @Inherited para este caso.

Por lo tanto, en este caso, no se ejecuta porque falta la anotación de JUnit.

Cuestiones relacionadas