プリミティブな Pointcut と Advise メソッドを使用して単純な Aspect を作成しました。
@Aspect
public class MyAspect {
@Pointcut("execution(static * com.mtag.util.SomeUtil.someMethod(..))")
public void someMethodInvoke() { }
@AfterReturning(value = "someMethodInvoke())", returning = "comparisonResult")
public void decrementProductCount(List<String> comparisonResult) {
//some actions
}
}
次の Spring アノテーションベースのアプリケーション構成があります。
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
//...
}
および com.mtag.util パッケージのユーティリティ クラス:
public class SomeUtil {
static List<String> someMethod(List<String> oldList, List<String> newList) {
//...
}
}
しかし、私が電話するとき
SomeUtil.someMethod(arg1, arg2);
単体テストでは、メソッド呼び出しが傍受されておらず、 @AfterReturning アドバイスが機能していないことがわかります。
しかし、someMethod() タイプをインスタンス (非静的) メソッドに変更すると、ポイントカットが
@Pointcut("execution(* com.mtag.util.SomeUtil.someMethod(..))")
@Component アノテーションを追加して、Spring で SomeUtil Bean を管理し、次のようにターゲット メソッドを呼び出します。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class}, loader = AnnotationConfigContextLoader.class)
public class SomeUtilTest {
@Autowired
private SomeUtil someUtil;
@Test
public void categoriesDiffCalc() {
List<String> result = someUtil.someMethod(...);
}
}
全て大丈夫。
どのようにして静的メソッドのアドバイスを設定できますか?