2009-08-09 12 views
10

Al escribir aspectos, ¿cómo puedo probar que coinciden y que se invocan cuando quiero?Prueba de AOP Aspecto de primavera

Estoy usando @Aspect declaraciones con Spring 2.5.6.


No me importa la funcionalidad, que se extrae y prueba de lo contrario.

Respuesta

7

que terminó la creación de algo que es un poco de una prueba de integración, de la siguiente manera:

Creado realizar una prueba unitaria Primavera-conscientes

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "aspects-test.xml" }) 
public class SomeAspectTest { 

} 

creado una configuración de la primavera de este ensayo, que:

  • habilita @AspectJ usage;
  • configura mi aspecto con dependencias ficticias
  • declara un grano que debe ser recogido por el aspecto

    <aop:aspectj-autoproxy /> 
    <bean class="SomeAspect"> 
        <property name="userDetailsSource"> 
          <bean class="StubUserDetailsSource"/> 
        </property> 
    </bean> 
    <bean class="DummyService"/> 
    

En la prueba de unidad de recupero el servicio maniquí y invocar sus métodos

@Autowired 
private DummyService _dummyService; 

@Test(expected = ApplicationSecurityException.class) 
public void adminOnlyFails() throws ApplicationSecurityException { 

    _dummyService.adminOnly(); 
} 
+0

¿Puedes darnos más detalles? – Javatar

+2

Creo que es normal crear una prueba de semi integración cuando tanta lógica se genera en tiempo de ejecución. – Gepsens

+0

Así que llama a un método que debe invocar los métodos de aspecto, pero nunca respondió cómo verificar que se están invocando los métodos de aspecto. @Javatar Creo que ese es el detalle que estás buscando? Supongo que su aspecto de ejemplo siempre arroja una ApplicationSecurityException? ¿Qué pasa con una invocación de método legítimo? – Jorge

8

Hay tres cosas diferentes para probar aquí:

  1. Están sus puntos de corte coincide con lo que esperas?
  2. ¿Su consejo hace referencia al punto de corte correcto?
  3. ¿El consejo hace lo que espera?

Para probar los puntos de corte, se puede definir algunos tipos de prueba que tengan las mismas firmas paquete/tipo/método como los objetivos "reales" destinados, a continuación, definir un consejo de ensayo frente a los puntos de corte para asegurar que están emparejados (también defina algunos tipos que no deberían coincidir para garantizar que los puntos de corte no sean demasiado liberales). Generalmente hago esto definiendo el consejo para hacer una devolución de llamada a un método en el objetivo de prueba, estableciendo un indicador, luego afirmo que se estableció el indicador.

Para probar el consejo es más complicado. Tiendo a delegar todo el cuerpo de consejos en un método normal, luego me concentro en probar el método en lugar del consejo.

Si ha hecho eso, la única parte que falta es que su consejo se aplica a los puntos correctos y realmente llama a los métodos. Si le preocupa que esto pueda ser un problema, puede hacerlo creando otro aspecto que coincida con su ejecución de aviso y establezca un indicador para mostrar que el método delegado esperado fue invocado por el aspecto y anule el método para no hacer nada.

Cuestiones relacionadas