2012-07-11 272 views
21

我可以单元测试大多数Spring类而不需要做Spring的“东西”。单元测试Spring @Around AOP方法

我能单元测试@Before通知方法,而无需使用弹簧太:

示例代码:

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

实施例试验:

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

与ProceedingJoinPoint对象然而@Around咨询的交易:

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

我不知道如何实例化ProceedingJoinPoint对象。如何在不启动整个Spring应用程序上下文的情况下测试此类?

+0

您能否提供完整的代码,您是如何实施@Before测试用例的?我需要帮助来实现这一点。 – 2017-12-03 19:05:59

回答

49

您可以通过编程方式创建代理测试春季看点:

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

...那么你可以调用proxy方法,并就aspectproxytarget断言。

+1

伟大的thx - 终于我可以正确地测试这些东西。你有什么想法,为什么你必须以编程方式做到这一点?我将MyAspect声明为一个bean,并在单元测试中加载这个上下文,所以期望这个方面被执行 - 但它只会以你描述她的方式工作... – CodeSeavers 2012-10-19 07:54:57

+0

好吧*我*必须这样做,因为我选择'在我的单元测试中使用Spring。如果你想在你的单元测试中启动一个Spring上下文,那么普通的Spring注意事项就适用了。 – slim 2012-10-22 11:01:42

+0

这些断言是什么样的?你有一些例子吗? – mip 2014-04-14 08:15:21