tipos persistencia crear anotaciones annotation java spring testing annotations spring-test

persistencia - crear annotations en java



Anotaciones de Java: simplificaciones de código (2)

Estoy buscando una forma de simplificar el siguiente código.

@WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { // My configuration classes }) public class MyServiceTest { @Autowired private MyService service; @Test public void myTest() { Assert.assertTrue(service != null); } }

Tengo muchas clases de configuración y no quiero ponerlas en cada clase de prueba. Entonces, tuve la idea de crear mi propia anotación:

@WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { // My configuration classes }) public @interface IntegrationTests { }

Intento usarlo de la siguiente manera:

@IntegrationTests public class MyServiceTest { @Autowired private MyService service; @Test public void myTest() { Assert.assertTrue(service != null); } }

Pero no funciona. ¿Alguna idea?


La razón por la que su anotación compuesta personalizada no funcionó es que JUnit no admite @RunWith como una meta-anotación. Por lo tanto, cuando redactes tu anotación de la siguiente manera ...

@WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { /* configuration classes */ }) public @interface IntegrationTests { }

... es JUnit que no puede ver que desea utilizar SpringJUnit4ClassRunner .

Spring Framework 4.0 y @WebAppConfiguration no deberían tener problemas para ver las declaraciones de @WebAppConfiguration y @ContextConfiguration utilizadas como meta-anotaciones.

En otras palabras, lo siguiente debería funcionar para usted:

@WebAppConfiguration @ContextConfiguration(classes = { /* configuration classes */ }) @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface IntegrationTests { } @RunWith(SpringJUnit4ClassRunner.class) @IntegrationTests public class MyServiceTest { @Autowired private MyService service; @Test public void myTest() { assertNotNull(service); } }

Como alternativa, puede usar una clase de prueba base abstract como lo recomienda axtavt.

Saludos,

Sam (autor del Spring TestContext Framework)


Puede colocar estas anotaciones en una superclase:

@WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { // My configuration classes }) public abstract class AbstractIntegrationTest { ... }

.

public class MyServiceTest extends AbstractIntegrationTest { ... }

Este enfoque también le permite declarar dependencias comunes @Autowired en la clase base y personalizar @ContextConfiguration clases @ContextConfiguration en pruebas concretas.