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.