2012-07-11 11 views
21

Puedo probar la mayoría de mis clases de primavera sin necesidad de hacer "cosas" de primavera.Pruebas unitarias Primavera @ Alrededor de los métodos AOP

que pueda métodos de asesoramiento @Before prueba unidad sin utilizar resorte demasiado:

código Ejemplo:

@Before("execution(* run(..)) && " + "" + 
      "target(target) && " + 
     "args(name)") 
public void logName(Object target, String name) { 
    logger.info("{} - run: {}", target, name); 
} 

Ejemplo de Ensayo:

@Test 
public void testLogName() { 
    aspect.setLogger(mockLogger); 
    aspect.logName(this,"Barry"); 
    assertTrue(mockLogger.hasLogged("TestAspect - run: Barry")); 
} 

ofertas de asesoramiento Sin embargo @Around con un objeto ProceedingJoinPoint :

@Around("com.xyz.myapp.SystemArchitecture.businessService()") 
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { 
    // start stopwatch 
    Object retVal = pjp.proceed(); 
    // stop stopwatch 
    return retVal; 
} 

No sé cómo crear una instancia de un objeto ProceedingJoinPoint. ¿Cómo pruebo esta clase sin comenzar todo el contexto de la aplicación Spring?

+0

¿Podría proporcionar el código completo, cómo ha implementado el caso de prueba para @Before? Necesito ayuda para implementar esto. –

Respuesta

49

Puede probar un aspecto primavera mediante la creación de un proxy mediante programación:

MyInterface target = new MyClass(); 
AspectJProxyFactory factory = new AspectJProxyFactory(target); 
MyAspect aspect = new MyAspect(arg); 
factory.addAspect(aspect); 
MyInterface proxy = factory.getProxy(); 

... entonces se puede llamar a los métodos de proxy, y hacer afirmaciones sobre aspect, proxy y target.

+1

Muy bien, finalmente puedo probarlo adecuadamente. ¿Tiene alguna idea de por qué tiene que hacer esto programáticamente? Decidí MyAspect como un frijol y cargué este contexto en la prueba unitaria, por lo que esperaba que se ejecutara el aspecto, pero solo funciona de la forma en que la describiste ... – CodeSeavers

+0

Bueno * I * tengo que hacerlo porque por elección no lo hago Usar Spring en mis pruebas unitarias. Si desea iniciar un contexto Spring en las pruebas de su unidad, entonces se aplican las consideraciones normales de Spring. – slim

+0

¿Cómo serían las afirmaciones? ¿Tienes algunos ejemplos? – mip

Cuestiones relacionadas