Polish AspectJAdvisorFactory tests

This commit is contained in:
Sam Brannen 2020-06-04 14:07:35 +02:00
parent 8dc8d88f88
commit 70b3de4afe
2 changed files with 101 additions and 99 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2019 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -63,14 +63,16 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
/** /**
* Abstract tests for AspectJAdvisorFactory. * Abstract tests for {@link AspectJAdvisorFactory} implementations.
* See subclasses for tests of concrete factories. *
* <p>See subclasses for tests of concrete factories.
* *
* @author Rod Johnson * @author Rod Johnson
* @author Chris Beams * @author Chris Beams
* @author Phillip Webb * @author Phillip Webb
* @author Sam Brannen
*/ */
public abstract class AbstractAspectJAdvisorFactoryTests { abstract class AbstractAspectJAdvisorFactoryTests {
/** /**
* To be overridden by concrete test subclasses. * To be overridden by concrete test subclasses.
@ -80,7 +82,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Test @Test
public void testRejectsPerCflowAspect() { void rejectsPerCflowAspect() {
assertThatExceptionOfType(AopConfigException.class).isThrownBy(() -> assertThatExceptionOfType(AopConfigException.class).isThrownBy(() ->
getFixture().getAdvisors( getFixture().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new PerCflowAspect(), "someBean"))) new SingletonMetadataAwareAspectInstanceFactory(new PerCflowAspect(), "someBean")))
@ -88,7 +90,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testRejectsPerCflowBelowAspect() { void rejectsPerCflowBelowAspect() {
assertThatExceptionOfType(AopConfigException.class).isThrownBy(() -> assertThatExceptionOfType(AopConfigException.class).isThrownBy(() ->
getFixture().getAdvisors( getFixture().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new PerCflowBelowAspect(), "someBean"))) new SingletonMetadataAwareAspectInstanceFactory(new PerCflowBelowAspect(), "someBean")))
@ -96,7 +98,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testPerTargetAspect() throws SecurityException, NoSuchMethodException { void perTargetAspect() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
@ -128,7 +130,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testMultiplePerTargetAspects() throws SecurityException, NoSuchMethodException { void multiplePerTargetAspects() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
@ -156,7 +158,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testMultiplePerTargetAspectsWithOrderAnnotation() throws SecurityException, NoSuchMethodException { void multiplePerTargetAspectsWithOrderAnnotation() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
@ -182,7 +184,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testPerThisAspect() throws SecurityException, NoSuchMethodException { void perThisAspect() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
@ -218,7 +220,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testPerTypeWithinAspect() throws SecurityException, NoSuchMethodException { void perTypeWithinAspect() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
@ -259,22 +261,22 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testNamedPointcutAspectWithFQN() { void namedPointcutAspectWithFQN() {
testNamedPointcuts(new NamedPointcutAspectWithFQN()); namedPointcuts(new NamedPointcutAspectWithFQN());
} }
@Test @Test
public void testNamedPointcutAspectWithoutFQN() { void namedPointcutAspectWithoutFQN() {
testNamedPointcuts(new NamedPointcutAspectWithoutFQN()); namedPointcuts(new NamedPointcutAspectWithoutFQN());
} }
@Test @Test
public void testNamedPointcutFromAspectLibrary() { void namedPointcutFromAspectLibrary() {
testNamedPointcuts(new NamedPointcutAspectFromLibrary()); namedPointcuts(new NamedPointcutAspectFromLibrary());
} }
@Test @Test
public void testNamedPointcutFromAspectLibraryWithBinding() { void namedPointcutFromAspectLibraryWithBinding() {
TestBean target = new TestBean(); TestBean target = new TestBean();
ITestBean itb = (ITestBean) createProxy(target, ITestBean itb = (ITestBean) createProxy(target,
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory( getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(
@ -285,7 +287,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
assertThat(target.getAge()).isEqualTo(20); assertThat(target.getAge()).isEqualTo(20);
} }
private void testNamedPointcuts(Object aspectInstance) { private void namedPointcuts(Object aspectInstance) {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
@ -297,7 +299,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testBindingWithSingleArg() { void bindingWithSingleArg() {
TestBean target = new TestBean(); TestBean target = new TestBean();
ITestBean itb = (ITestBean) createProxy(target, ITestBean itb = (ITestBean) createProxy(target,
getFixture().getAdvisors( getFixture().getAdvisors(
@ -309,7 +311,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testBindingWithMultipleArgsDifferentlyOrdered() { void bindingWithMultipleArgsDifferentlyOrdered() {
ManyValuedArgs target = new ManyValuedArgs(); ManyValuedArgs target = new ManyValuedArgs();
ManyValuedArgs mva = (ManyValuedArgs) createProxy(target, ManyValuedArgs mva = (ManyValuedArgs) createProxy(target,
getFixture().getAdvisors( getFixture().getAdvisors(
@ -329,7 +331,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
* In this case the introduction will be made. * In this case the introduction will be made.
*/ */
@Test @Test
public void testIntroductionOnTargetNotImplementingInterface() { void introductionOnTargetNotImplementingInterface() {
NotLockable notLockableTarget = new NotLockable(); NotLockable notLockableTarget = new NotLockable();
assertThat(notLockableTarget instanceof Lockable).isFalse(); assertThat(notLockableTarget instanceof Lockable).isFalse();
NotLockable notLockable1 = (NotLockable) createProxy(notLockableTarget, NotLockable notLockable1 = (NotLockable) createProxy(notLockableTarget,
@ -358,7 +360,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testIntroductionAdvisorExcludedFromTargetImplementingInterface() { void introductionAdvisorExcludedFromTargetImplementingInterface() {
assertThat(AopUtils.findAdvisorsThatCanApply( assertThat(AopUtils.findAdvisorsThatCanApply(
getFixture().getAdvisors( getFixture().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")),
@ -368,7 +370,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testIntroductionOnTargetImplementingInterface() { void introductionOnTargetImplementingInterface() {
CannotBeUnlocked target = new CannotBeUnlocked(); CannotBeUnlocked target = new CannotBeUnlocked();
Lockable proxy = (Lockable) createProxy(target, Lockable proxy = (Lockable) createProxy(target,
// Ensure that we exclude // Ensure that we exclude
@ -388,7 +390,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testIntroductionOnTargetExcludedByTypePattern() { void introductionOnTargetExcludedByTypePattern() {
LinkedList<Object> target = new LinkedList<>(); LinkedList<Object> target = new LinkedList<>();
List<?> proxy = (List<?>) createProxy(target, List<?> proxy = (List<?>) createProxy(target,
AopUtils.findAdvisorsThatCanApply( AopUtils.findAdvisorsThatCanApply(
@ -400,7 +402,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testIntroductionBasedOnAnnotationMatch_SPR5307() { void introductionBasedOnAnnotationMatch_SPR5307() {
AnnotatedTarget target = new AnnotatedTargetImpl(); AnnotatedTarget target = new AnnotatedTargetImpl();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getFixture().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new MakeAnnotatedTypeModifiable(), "someBean")); new SingletonMetadataAwareAspectInstanceFactory(new MakeAnnotatedTypeModifiable(), "someBean"));
@ -414,7 +416,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
// TODO: Why does this test fail? It hasn't been run before, so it maybe never actually passed... // TODO: Why does this test fail? It hasn't been run before, so it maybe never actually passed...
@Test @Test
@Disabled @Disabled
public void testIntroductionWithArgumentBinding() { void introductionWithArgumentBinding() {
TestBean target = new TestBean(); TestBean target = new TestBean();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getFixture().getAdvisors(
@ -448,7 +450,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testAspectMethodThrowsExceptionLegalOnSignature() { void aspectMethodThrowsExceptionLegalOnSignature() {
TestBean target = new TestBean(); TestBean target = new TestBean();
UnsupportedOperationException expectedException = new UnsupportedOperationException(); UnsupportedOperationException expectedException = new UnsupportedOperationException();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getFixture().getAdvisors(
@ -462,7 +464,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
// TODO document this behaviour. // TODO document this behaviour.
// Is it different AspectJ behaviour, at least for checked exceptions? // Is it different AspectJ behaviour, at least for checked exceptions?
@Test @Test
public void testAspectMethodThrowsExceptionIllegalOnSignature() { void aspectMethodThrowsExceptionIllegalOnSignature() {
TestBean target = new TestBean(); TestBean target = new TestBean();
RemoteException expectedException = new RemoteException(); RemoteException expectedException = new RemoteException();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getFixture().getAdvisors(
@ -491,7 +493,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testTwoAdvicesOnOneAspect() { void twoAdvicesOnOneAspect() {
TestBean target = new TestBean(); TestBean target = new TestBean();
TwoAdviceAspect twoAdviceAspect = new TwoAdviceAspect(); TwoAdviceAspect twoAdviceAspect = new TwoAdviceAspect();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getFixture().getAdvisors(
@ -506,7 +508,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testAfterAdviceTypes() throws Exception { void afterAdviceTypes() throws Exception {
Echo target = new Echo(); Echo target = new Echo();
ExceptionHandling afterReturningAspect = new ExceptionHandling(); ExceptionHandling afterReturningAspect = new ExceptionHandling();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getFixture().getAdvisors(
@ -524,7 +526,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testFailureWithoutExplicitDeclarePrecedence() { void failureWithoutExplicitDeclarePrecedence() {
TestBean target = new TestBean(); TestBean target = new TestBean();
MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory(
new NoDeclarePrecedenceShouldFail(), "someBean"); new NoDeclarePrecedenceShouldFail(), "someBean");
@ -534,7 +536,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
} }
@Test @Test
public void testDeclarePrecedenceNotSupported() { void declarePrecedenceNotSupported() {
TestBean target = new TestBean(); TestBean target = new TestBean();
assertThatIllegalArgumentException().isThrownBy(() -> { assertThatIllegalArgumentException().isThrownBy(() -> {
MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory(
@ -545,28 +547,28 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect("percflow(execution(* *(..)))") @Aspect("percflow(execution(* *(..)))")
public static class PerCflowAspect { static class PerCflowAspect {
} }
@Aspect("percflowbelow(execution(* *(..)))") @Aspect("percflowbelow(execution(* *(..)))")
public static class PerCflowBelowAspect { static class PerCflowBelowAspect {
} }
@Aspect("pertarget(execution(* *.getSpouse()))") @Aspect("pertarget(execution(* *.getSpouse()))")
@Order(10) @Order(10)
public static class PerTargetAspectWithOrderAnnotation10 { static class PerTargetAspectWithOrderAnnotation10 {
public int count; int count;
@Around("execution(int *.getAge())") @Around("execution(int *.getAge())")
public int returnCountAsAge() { int returnCountAsAge() {
return count++; return count++;
} }
@Before("execution(void *.set*(int))") @Before("execution(void *.set*(int))")
public void countSetter() { void countSetter() {
++count; ++count;
} }
} }
@ -574,34 +576,34 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect("pertarget(execution(* *.getSpouse()))") @Aspect("pertarget(execution(* *.getSpouse()))")
@Order(5) @Order(5)
public static class PerTargetAspectWithOrderAnnotation5 { static class PerTargetAspectWithOrderAnnotation5 {
public int count; int count;
@Around("execution(int *.getAge())") @Around("execution(int *.getAge())")
public int returnCountAsAge() { int returnCountAsAge() {
return count++; return count++;
} }
@Before("execution(void *.set*(int))") @Before("execution(void *.set*(int))")
public void countSetter() { void countSetter() {
++count; ++count;
} }
} }
@Aspect("pertypewithin(org.springframework.beans.testfixture.beans.IOther+)") @Aspect("pertypewithin(org.springframework.beans.testfixture.beans.IOther+)")
public static class PerTypeWithinAspect { static class PerTypeWithinAspect {
public int count; int count;
@Around("execution(int *.getAge())") @Around("execution(int *.getAge())")
public int returnCountAsAge() { int returnCountAsAge() {
return count++; return count++;
} }
@Before("execution(void *.*(..))") @Before("execution(void *.*(..))")
public void countAnythingVoid() { void countAnythingVoid() {
++count; ++count;
} }
} }
@ -611,7 +613,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
private int count; private int count;
public int getInstantiationCount() { int getInstantiationCount() {
return this.count; return this.count;
} }
@ -644,97 +646,96 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect @Aspect
public static class NamedPointcutAspectWithFQN { static class NamedPointcutAspectWithFQN {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private ITestBean fieldThatShouldBeIgnoredBySpringAtAspectJProcessing = new TestBean(); private ITestBean fieldThatShouldBeIgnoredBySpringAtAspectJProcessing = new TestBean();
@Pointcut("execution(* getAge())") @Pointcut("execution(* getAge())")
public void getAge() { void getAge() {
} }
@Around("org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.NamedPointcutAspectWithFQN.getAge()") @Around("org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.NamedPointcutAspectWithFQN.getAge()")
public int changeReturnValue(ProceedingJoinPoint pjp) { int changeReturnValue(ProceedingJoinPoint pjp) {
return -1; return -1;
} }
} }
@Aspect @Aspect
public static class NamedPointcutAspectWithoutFQN { static class NamedPointcutAspectWithoutFQN {
@Pointcut("execution(* getAge())") @Pointcut("execution(* getAge())")
public void getAge() { void getAge() {
} }
@Around("getAge()") @Around("getAge()")
public int changeReturnValue(ProceedingJoinPoint pjp) { int changeReturnValue(ProceedingJoinPoint pjp) {
return -1; return -1;
} }
} }
@Aspect @Aspect
public static class NamedPointcutAspectFromLibrary { static class NamedPointcutAspectFromLibrary {
@Around("org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.Library.propertyAccess()") @Around("org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.Library.propertyAccess()")
public int changeReturnType(ProceedingJoinPoint pjp) { int changeReturnType(ProceedingJoinPoint pjp) {
return -1; return -1;
} }
@Around(value="org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.Library.integerArgOperation(x)", argNames="x") @Around(value="org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.Library.integerArgOperation(x)", argNames="x")
public void doubleArg(ProceedingJoinPoint pjp, int x) throws Throwable { void doubleArg(ProceedingJoinPoint pjp, int x) throws Throwable {
pjp.proceed(new Object[] {x*2}); pjp.proceed(new Object[] {x*2});
} }
} }
@Aspect @Aspect
public static class Library { static class Library {
@Pointcut("execution(!void get*())") @Pointcut("execution(!void get*())")
public void propertyAccess() {} void propertyAccess() {}
@Pointcut("execution(* *(..)) && args(i)") @Pointcut("execution(* *(..)) && args(i)")
public void integerArgOperation(int i) {} void integerArgOperation(int i) {}
} }
@Aspect @Aspect
public static class NamedPointcutAspectFromLibraryWithBinding { static class NamedPointcutAspectFromLibraryWithBinding {
@Around(value="org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.Library.integerArgOperation(x)", argNames="x") @Around(value="org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactoryTests.Library.integerArgOperation(x)", argNames="x")
public void doubleArg(ProceedingJoinPoint pjp, int x) throws Throwable { void doubleArg(ProceedingJoinPoint pjp, int x) throws Throwable {
pjp.proceed(new Object[] {x*2}); pjp.proceed(new Object[] {x*2});
} }
} }
@Aspect @Aspect
public static class BindingAspectWithSingleArg { static class BindingAspectWithSingleArg {
@Pointcut(value="args(a)", argNames="a") @Pointcut(value="args(a)", argNames="a")
public void setAge(int a) {} void setAge(int a) {}
@Around(value="setAge(age)",argNames="age") @Around(value="setAge(age)",argNames="age")
// @ArgNames({"age"}) // AMC needs more work here? ignoring pjp arg... ok?? // @ArgNames({"age"}) // AMC needs more work here? ignoring pjp arg... ok??
// argNames should be supported in Around as it is in Pointcut // argNames should be supported in Around as it is in Pointcut
public void changeReturnType(ProceedingJoinPoint pjp, int age) throws Throwable { void changeReturnType(ProceedingJoinPoint pjp, int age) throws Throwable {
pjp.proceed(new Object[] {age*2}); pjp.proceed(new Object[] {age*2});
} }
} }
@Aspect @Aspect
public static class ManyValuedArgs { static class ManyValuedArgs {
public String mungeArgs(String a, int b, int c, String d, StringBuffer e) { String mungeArgs(String a, int b, int c, String d, StringBuffer e) {
return a + b + c + d + e; return a + b + c + d + e;
} }
@Around(value="execution(String mungeArgs(..)) && args(a, b, c, d, e)", argNames="b,c,d,e,a") @Around(value="execution(String mungeArgs(..)) && args(a, b, c, d, e)", argNames="b,c,d,e,a")
public String reverseAdvice(ProceedingJoinPoint pjp, int b, int c, String d, StringBuffer e, String a) throws Throwable { String reverseAdvice(ProceedingJoinPoint pjp, int b, int c, String d, StringBuffer e, String a) throws Throwable {
assertThat(pjp.proceed()).isEqualTo(a + b+ c+ d+ e); assertThat(pjp.proceed()).isEqualTo(a + b+ c+ d+ e);
return a + b + c + d + e; return a + b + c + d + e;
} }
@ -742,24 +743,24 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect @Aspect
public static class ExceptionAspect { static class ExceptionAspect {
private final Exception ex; private final Exception ex;
public ExceptionAspect(Exception ex) { ExceptionAspect(Exception ex) {
this.ex = ex; this.ex = ex;
} }
@Before("execution(* getAge())") @Before("execution(* getAge())")
public void throwException() throws Exception { void throwException() throws Exception {
throw ex; throw ex;
} }
} }
public static class Echo { static class Echo {
public Object echo(Object o) throws Exception { Object echo(Object o) throws Exception {
if (o instanceof Exception) { if (o instanceof Exception) {
throw (Exception) o; throw (Exception) o;
} }
@ -769,7 +770,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect @Aspect
public static class ExceptionHandling { static class ExceptionHandling {
public int successCount; public int successCount;
@ -795,19 +796,19 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect @Aspect
public static class NoDeclarePrecedenceShouldFail { static class NoDeclarePrecedenceShouldFail {
@Pointcut("execution(int *.getAge())") @Pointcut("execution(int *.getAge())")
public void getAge() { void getAge() {
} }
@Before("getAge()") @Before("getAge()")
public void blowUpButDoesntMatterBecauseAroundAdviceWontLetThisBeInvoked() { void blowUpButDoesntMatterBecauseAroundAdviceWontLetThisBeInvoked() {
throw new IllegalStateException(); throw new IllegalStateException();
} }
@Around("getAge()") @Around("getAge()")
public int preventExecution(ProceedingJoinPoint pjp) { int preventExecution(ProceedingJoinPoint pjp) {
return 666; return 666;
} }
} }
@ -815,19 +816,19 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect @Aspect
@DeclarePrecedence("test..*") @DeclarePrecedence("test..*")
public static class DeclarePrecedenceShouldSucceed { static class DeclarePrecedenceShouldSucceed {
@Pointcut("execution(int *.getAge())") @Pointcut("execution(int *.getAge())")
public void getAge() { void getAge() {
} }
@Before("getAge()") @Before("getAge()")
public void blowUpButDoesntMatterBecauseAroundAdviceWontLetThisBeInvoked() { void blowUpButDoesntMatterBecauseAroundAdviceWontLetThisBeInvoked() {
throw new IllegalStateException(); throw new IllegalStateException();
} }
@Around("getAge()") @Around("getAge()")
public int preventExecution(ProceedingJoinPoint pjp) { int preventExecution(ProceedingJoinPoint pjp) {
return 666; return 666;
} }
} }
@ -845,12 +846,12 @@ public abstract class AbstractAspectJAdvisorFactoryTests {
@Aspect @Aspect
abstract class AbstractMakeModifiable { abstract class AbstractMakeModifiable {
public interface MutableModifiable extends Modifiable { interface MutableModifiable extends Modifiable {
void markDirty(); void markDirty();
} }
public static class ModifiableImpl implements MutableModifiable { static class ModifiableImpl implements MutableModifiable {
private boolean modified; private boolean modified;
@ -871,7 +872,7 @@ abstract class AbstractMakeModifiable {
} }
@Before(value="execution(void set*(*)) && this(modifiable) && args(newValue)", argNames="modifiable,newValue") @Before(value="execution(void set*(*)) && this(modifiable) && args(newValue)", argNames="modifiable,newValue")
public void recordModificationIfSetterArgumentDiffersFromOldValue( void recordModificationIfSetterArgumentDiffersFromOldValue(
JoinPoint jp, MutableModifiable mixin, Object newValue) { JoinPoint jp, MutableModifiable mixin, Object newValue) {
/* /*
@ -933,7 +934,7 @@ class MakeITestBeanModifiable extends AbstractMakeModifiable {
@DeclareParents(value = "org.springframework.beans.testfixture.beans.ITestBean+", @DeclareParents(value = "org.springframework.beans.testfixture.beans.ITestBean+",
defaultImpl=ModifiableImpl.class) defaultImpl=ModifiableImpl.class)
public static MutableModifiable mixin; static MutableModifiable mixin;
} }
@ -948,7 +949,7 @@ class MakeAnnotatedTypeModifiable extends AbstractMakeModifiable {
@DeclareParents(value = "(@org.springframework.aop.aspectj.annotation.Measured *)", @DeclareParents(value = "(@org.springframework.aop.aspectj.annotation.Measured *)",
defaultImpl = DefaultLockable.class) defaultImpl = DefaultLockable.class)
public static Lockable mixin; static Lockable mixin;
} }
@ -960,10 +961,10 @@ class MakeAnnotatedTypeModifiable extends AbstractMakeModifiable {
class MakeLockable { class MakeLockable {
@DeclareParents(value = "org.springframework..*", defaultImpl = DefaultLockable.class) @DeclareParents(value = "org.springframework..*", defaultImpl = DefaultLockable.class)
public static Lockable mixin; static Lockable mixin;
@Before(value="execution(void set*(*)) && this(mixin)", argNames="mixin") @Before(value="execution(void set*(*)) && this(mixin)", argNames="mixin")
public void checkNotLocked( Lockable mixin) { void checkNotLocked( Lockable mixin) {
// Can also obtain the mixin (this) this way // Can also obtain the mixin (this) this way
//Lockable mixin = (Lockable) jp.getThis(); //Lockable mixin = (Lockable) jp.getThis();
if (mixin.locked()) { if (mixin.locked()) {
@ -1032,11 +1033,11 @@ class NotLockable {
private int intValue; private int intValue;
public int getIntValue() { int getIntValue() {
return intValue; return intValue;
} }
public void setIntValue(int intValue) { void setIntValue(int intValue) {
this.intValue = intValue; this.intValue = intValue;
} }
@ -1046,19 +1047,19 @@ class NotLockable {
@Aspect("perthis(execution(* *.getSpouse()))") @Aspect("perthis(execution(* *.getSpouse()))")
class PerThisAspect { class PerThisAspect {
public int count; int count;
// Just to check that this doesn't cause problems with introduction processing // Just to check that this doesn't cause problems with introduction processing
@SuppressWarnings("unused") @SuppressWarnings("unused")
private ITestBean fieldThatShouldBeIgnoredBySpringAtAspectJProcessing = new TestBean(); private ITestBean fieldThatShouldBeIgnoredBySpringAtAspectJProcessing = new TestBean();
@Around("execution(int *.getAge())") @Around("execution(int *.getAge())")
public int returnCountAsAge() { int returnCountAsAge() {
return count++; return count++;
} }
@Before("execution(void *.set*(int))") @Before("execution(void *.set*(int))")
public void countSetter() { void countSetter() {
++count; ++count;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,13 +17,14 @@
package org.springframework.aop.aspectj.annotation; package org.springframework.aop.aspectj.annotation;
/** /**
* Tests for ReflectiveAtAspectJAdvisorFactory. * Tests for {@link ReflectiveAspectJAdvisorFactory}.
* Tests are inherited: we only set the test fixture here. *
* <p>Tests are inherited: we only set the test fixture here.
* *
* @author Rod Johnson * @author Rod Johnson
* @since 2.0 * @since 2.0
*/ */
public class ReflectiveAspectJAdvisorFactoryTests extends AbstractAspectJAdvisorFactoryTests { class ReflectiveAspectJAdvisorFactoryTests extends AbstractAspectJAdvisorFactoryTests {
@Override @Override
protected AspectJAdvisorFactory getFixture() { protected AspectJAdvisorFactory getFixture() {