2012-07-11 156 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