Polishing

This commit is contained in:
Sam Brannen 2023-01-17 16:01:23 +01:00
parent 1680502313
commit e4b25ab480
3 changed files with 334 additions and 355 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2022 the original author or authors. * Copyright 2002-2023 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.
@ -20,6 +20,7 @@ import java.io.FileNotFoundException;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.UndeclaredThrowableException; import java.lang.reflect.UndeclaredThrowableException;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.util.ArrayList; import java.util.ArrayList;
@ -76,24 +77,21 @@ abstract class AbstractAspectJAdvisorFactoryTests {
/** /**
* To be overridden by concrete test subclasses. * To be overridden by concrete test subclasses.
* @return the fixture
*/ */
protected abstract AspectJAdvisorFactory getFixture(); protected abstract AspectJAdvisorFactory getAdvisorFactory();
@Test @Test
void rejectsPerCflowAspect() { void rejectsPerCflowAspect() {
assertThatExceptionOfType(AopConfigException.class).isThrownBy(() -> assertThatExceptionOfType(AopConfigException.class)
getFixture().getAdvisors( .isThrownBy(() -> getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerCflowAspect(), "someBean")))
new SingletonMetadataAwareAspectInstanceFactory(new PerCflowAspect(), "someBean")))
.withMessageContaining("PERCFLOW"); .withMessageContaining("PERCFLOW");
} }
@Test @Test
void rejectsPerCflowBelowAspect() { void rejectsPerCflowBelowAspect() {
assertThatExceptionOfType(AopConfigException.class).isThrownBy(() -> assertThatExceptionOfType(AopConfigException.class)
getFixture().getAdvisors( .isThrownBy(() -> getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerCflowBelowAspect(), "someBean")))
new SingletonMetadataAwareAspectInstanceFactory(new PerCflowBelowAspect(), "someBean")))
.withMessageContaining("PERCFLOWBELOW"); .withMessageContaining("PERCFLOWBELOW");
} }
@ -102,9 +100,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
TestBean itb = (TestBean) createProxy(target, TestBean itb = createProxy(target, TestBean.class,
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerTargetAspect(), "someBean")), getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerTargetAspect(), "someBean")));
TestBean.class);
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge);
Advised advised = (Advised) itb; Advised advised = (Advised) itb;
@ -139,15 +136,13 @@ abstract class AbstractAspectJAdvisorFactoryTests {
PerTargetAspect aspect1 = new PerTargetAspect(); PerTargetAspect aspect1 = new PerTargetAspect();
aspect1.count = 100; aspect1.count = 100;
aspect1.setOrder(10); aspect1.setOrder(10);
advisors.addAll( advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect1, "someBean1")));
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspect aspect2 = new PerTargetAspect(); PerTargetAspect aspect2 = new PerTargetAspect();
aspect2.setOrder(5); aspect2.setOrder(5);
advisors.addAll( advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect2, "someBean2")));
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
OrderComparator.sort(advisors); OrderComparator.sort(advisors);
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class); TestBean itb = createProxy(target, TestBean.class, advisors);
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge);
// Hit the method in the per clause to instantiate the aspect // Hit the method in the per clause to instantiate the aspect
@ -166,14 +161,12 @@ abstract class AbstractAspectJAdvisorFactoryTests {
List<Advisor> advisors = new ArrayList<>(); List<Advisor> advisors = new ArrayList<>();
PerTargetAspectWithOrderAnnotation10 aspect1 = new PerTargetAspectWithOrderAnnotation10(); PerTargetAspectWithOrderAnnotation10 aspect1 = new PerTargetAspectWithOrderAnnotation10();
aspect1.count = 100; aspect1.count = 100;
advisors.addAll( advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect1, "someBean1")));
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspectWithOrderAnnotation5 aspect2 = new PerTargetAspectWithOrderAnnotation5(); PerTargetAspectWithOrderAnnotation5 aspect2 = new PerTargetAspectWithOrderAnnotation5();
advisors.addAll( advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect2, "someBean2")));
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
OrderComparator.sort(advisors); OrderComparator.sort(advisors);
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class); TestBean itb = createProxy(target, TestBean.class, advisors);
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge);
// Hit the method in the per clause to instantiate the aspect // Hit the method in the per clause to instantiate the aspect
@ -188,9 +181,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
TestBean itb = (TestBean) createProxy(target, TestBean itb = createProxy(target, TestBean.class,
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerThisAspect(), "someBean")), getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerThisAspect(), "someBean")));
TestBean.class);
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge);
Advised advised = (Advised) itb; Advised advised = (Advised) itb;
@ -225,7 +217,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
PerTypeWithinAspectInstanceFactory aif = new PerTypeWithinAspectInstanceFactory(); PerTypeWithinAspectInstanceFactory aif = new PerTypeWithinAspectInstanceFactory();
TestBean itb = (TestBean) createProxy(target, getFixture().getAdvisors(aif), TestBean.class); TestBean itb = createProxy(target, TestBean.class, getAdvisorFactory().getAdvisors(aif));
assertThat(aif.getInstantiationCount()).as("No method calls").isEqualTo(0); assertThat(aif.getInstantiationCount()).as("No method calls").isEqualTo(0);
assertThat(itb.getAge()).as("Around advice must now apply").isEqualTo(0); assertThat(itb.getAge()).as("Around advice must now apply").isEqualTo(0);
@ -254,7 +246,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
assertThat(itb.getAge()).as("Around advice must still apply").isEqualTo(1); assertThat(itb.getAge()).as("Around advice must still apply").isEqualTo(1);
assertThat(itb.getAge()).as("Around advice must still apply").isEqualTo(2); assertThat(itb.getAge()).as("Around advice must still apply").isEqualTo(2);
TestBean itb2 = (TestBean) createProxy(target, getFixture().getAdvisors(aif), TestBean.class); TestBean itb2 = createProxy(target, TestBean.class, getAdvisorFactory().getAdvisors(aif));
assertThat(aif.getInstantiationCount()).isEqualTo(1); assertThat(aif.getInstantiationCount()).isEqualTo(1);
assertThat(itb2.getAge()).as("Around advice be independent for second instance").isEqualTo(0); assertThat(itb2.getAge()).as("Around advice be independent for second instance").isEqualTo(0);
assertThat(aif.getInstantiationCount()).isEqualTo(2); assertThat(aif.getInstantiationCount()).isEqualTo(2);
@ -278,10 +270,9 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@Test @Test
void namedPointcutFromAspectLibraryWithBinding() { void namedPointcutFromAspectLibraryWithBinding() {
TestBean target = new TestBean(); TestBean target = new TestBean();
ITestBean itb = (ITestBean) createProxy(target, ITestBean itb = createProxy(target, ITestBean.class,
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory( getAdvisorFactory().getAdvisors(aspectInstanceFactory(
new NamedPointcutAspectFromLibraryWithBinding(), "someBean")), new NamedPointcutAspectFromLibraryWithBinding(), "someBean")));
ITestBean.class);
itb.setAge(10); itb.setAge(10);
assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(20); assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(20);
assertThat(target.getAge()).isEqualTo(20); assertThat(target.getAge()).isEqualTo(20);
@ -291,9 +282,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
TestBean target = new TestBean(); TestBean target = new TestBean();
int realAge = 65; int realAge = 65;
target.setAge(realAge); target.setAge(realAge);
ITestBean itb = (ITestBean) createProxy(target, ITestBean itb = createProxy(target, ITestBean.class,
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspectInstance, "someBean")), getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspectInstance, "someBean")));
ITestBean.class);
assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(-1); assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(-1);
assertThat(target.getAge()).isEqualTo(realAge); assertThat(target.getAge()).isEqualTo(realAge);
} }
@ -301,10 +291,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@Test @Test
void bindingWithSingleArg() { void bindingWithSingleArg() {
TestBean target = new TestBean(); TestBean target = new TestBean();
ITestBean itb = (ITestBean) createProxy(target, ITestBean itb = createProxy(target, ITestBean.class,
getFixture().getAdvisors( getAdvisorFactory().getAdvisors(aspectInstanceFactory(new BindingAspectWithSingleArg(), "someBean")));
new SingletonMetadataAwareAspectInstanceFactory(new BindingAspectWithSingleArg(), "someBean")),
ITestBean.class);
itb.setAge(10); itb.setAge(10);
assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(20); assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(20);
assertThat(target.getAge()).isEqualTo(20); assertThat(target.getAge()).isEqualTo(20);
@ -313,10 +301,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@Test @Test
void bindingWithMultipleArgsDifferentlyOrdered() { void bindingWithMultipleArgsDifferentlyOrdered() {
ManyValuedArgs target = new ManyValuedArgs(); ManyValuedArgs target = new ManyValuedArgs();
ManyValuedArgs mva = (ManyValuedArgs) createProxy(target, ManyValuedArgs mva = createProxy(target, ManyValuedArgs.class,
getFixture().getAdvisors( getAdvisorFactory().getAdvisors(aspectInstanceFactory(new ManyValuedArgs(), "someBean")));
new SingletonMetadataAwareAspectInstanceFactory(new ManyValuedArgs(), "someBean")),
ManyValuedArgs.class);
String a = "a"; String a = "a";
int b = 12; int b = 12;
@ -334,10 +320,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
void introductionOnTargetNotImplementingInterface() { 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 = createProxy(notLockableTarget, NotLockable.class,
getFixture().getAdvisors( getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean")));
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")),
NotLockable.class);
assertThat(notLockable1 instanceof Lockable).isTrue(); assertThat(notLockable1 instanceof Lockable).isTrue();
Lockable lockable = (Lockable) notLockable1; Lockable lockable = (Lockable) notLockable1;
assertThat(lockable.locked()).isFalse(); assertThat(lockable.locked()).isFalse();
@ -345,72 +329,64 @@ abstract class AbstractAspectJAdvisorFactoryTests {
assertThat(lockable.locked()).isTrue(); assertThat(lockable.locked()).isTrue();
NotLockable notLockable2Target = new NotLockable(); NotLockable notLockable2Target = new NotLockable();
NotLockable notLockable2 = (NotLockable) createProxy(notLockable2Target, NotLockable notLockable2 = createProxy(notLockable2Target, NotLockable.class,
getFixture().getAdvisors( getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean")));
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")),
NotLockable.class);
assertThat(notLockable2 instanceof Lockable).isTrue(); assertThat(notLockable2 instanceof Lockable).isTrue();
Lockable lockable2 = (Lockable) notLockable2; Lockable lockable2 = (Lockable) notLockable2;
assertThat(lockable2.locked()).isFalse(); assertThat(lockable2.locked()).isFalse();
notLockable2.setIntValue(1); notLockable2.setIntValue(1);
lockable2.lock(); lockable2.lock();
assertThatIllegalStateException().isThrownBy(() -> assertThatIllegalStateException().isThrownBy(() -> notLockable2.setIntValue(32));
notLockable2.setIntValue(32));
assertThat(lockable2.locked()).isTrue(); assertThat(lockable2.locked()).isTrue();
} }
@Test @Test
void introductionAdvisorExcludedFromTargetImplementingInterface() { void introductionAdvisorExcludedFromTargetImplementingInterface() {
assertThat(AopUtils.findAdvisorsThatCanApply( assertThat(AopUtils.findAdvisorsThatCanApply(
getFixture().getAdvisors( getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), aspectInstanceFactory(new MakeLockable(), "someBean")),
CannotBeUnlocked.class).isEmpty()).isTrue(); CannotBeUnlocked.class).isEmpty()).isTrue();
assertThat(AopUtils.findAdvisorsThatCanApply(getFixture().getAdvisors( assertThat(AopUtils.findAdvisorsThatCanApply(getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean")), NotLockable.class)).hasSize(2); aspectInstanceFactory(new MakeLockable(),"someBean")), NotLockable.class)).hasSize(2);
} }
@Test @Test
void introductionOnTargetImplementingInterface() { void introductionOnTargetImplementingInterface() {
CannotBeUnlocked target = new CannotBeUnlocked(); CannotBeUnlocked target = new CannotBeUnlocked();
Lockable proxy = (Lockable) createProxy(target, Lockable proxy = createProxy(target, CannotBeUnlocked.class,
// Ensure that we exclude // Ensure that we exclude
AopUtils.findAdvisorsThatCanApply( AopUtils.findAdvisorsThatCanApply(
getFixture().getAdvisors( getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean")),
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), CannotBeUnlocked.class));
CannotBeUnlocked.class
),
CannotBeUnlocked.class);
assertThat(proxy).isInstanceOf(Lockable.class); assertThat(proxy).isInstanceOf(Lockable.class);
Lockable lockable = proxy; Lockable lockable = proxy;
assertThat(lockable.locked()).as("Already locked").isTrue(); assertThat(lockable.locked()).as("Already locked").isTrue();
lockable.lock(); lockable.lock();
assertThat(lockable.locked()).as("Real target ignores locking").isTrue(); assertThat(lockable.locked()).as("Real target ignores locking").isTrue();
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> lockable.unlock());
lockable.unlock());
} }
@Test @Test
void introductionOnTargetExcludedByTypePattern() { void introductionOnTargetExcludedByTypePattern() {
ArrayList<Object> target = new ArrayList<>(); ArrayList<Object> target = new ArrayList<>();
List<?> proxy = (List<?>) createProxy(target, List<?> proxy = createProxy(target, List.class,
AopUtils.findAdvisorsThatCanApply( AopUtils.findAdvisorsThatCanApply(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean")),
List.class List.class));
),
List.class);
assertThat(proxy instanceof Lockable).as("Type pattern must have excluded mixin").isFalse(); assertThat(proxy instanceof Lockable).as("Type pattern must have excluded mixin").isFalse();
} }
@Test @Test
void introductionBasedOnAnnotationMatch_SPR5307() { void introductionBasedOnAnnotationMatch() { // gh-9980
AnnotatedTarget target = new AnnotatedTargetImpl(); AnnotatedTarget target = new AnnotatedTargetImpl();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new MakeAnnotatedTypeModifiable(), "someBean")); aspectInstanceFactory(new MakeAnnotatedTypeModifiable(), "someBean"));
Object proxy = createProxy(target, advisors, AnnotatedTarget.class); Object proxy = createProxy(target, AnnotatedTarget.class, advisors);
System.out.println(advisors.get(1)); assertThat(proxy).isInstanceOf(Lockable.class);
assertThat(proxy instanceof Lockable).isTrue(); Lockable lockable = (Lockable) proxy;
Lockable lockable = (Lockable)proxy; assertThat(lockable.locked()).isFalse();
lockable.locked(); lockable.lock();
assertThat(lockable.locked()).isTrue();
} }
// 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...
@ -419,12 +395,12 @@ abstract class AbstractAspectJAdvisorFactoryTests {
void introductionWithArgumentBinding() { void introductionWithArgumentBinding() {
TestBean target = new TestBean(); TestBean target = new TestBean();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new MakeITestBeanModifiable(), "someBean")); aspectInstanceFactory(new MakeITestBeanModifiable(), "someBean"));
advisors.addAll(getFixture().getAdvisors( advisors.addAll(getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean"))); aspectInstanceFactory(new MakeLockable(), "someBean")));
Modifiable modifiable = (Modifiable) createProxy(target, advisors, ITestBean.class); Modifiable modifiable = (Modifiable) createProxy(target, ITestBean.class, advisors);
assertThat(modifiable).isInstanceOf(Modifiable.class); assertThat(modifiable).isInstanceOf(Modifiable.class);
Lockable lockable = (Lockable) modifiable; Lockable lockable = (Lockable) modifiable;
assertThat(lockable.locked()).isFalse(); assertThat(lockable.locked()).isFalse();
@ -443,8 +419,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
lockable.lock(); lockable.lock();
assertThat(lockable.locked()).isTrue(); assertThat(lockable.locked()).isTrue();
assertThatIllegalStateException().as("Should be locked").isThrownBy(() -> assertThatIllegalStateException().as("Should be locked").isThrownBy(() -> itb.setName("Else"));
itb.setName("Else"));
lockable.unlock(); lockable.unlock();
itb.setName("Tony"); itb.setName("Tony");
} }
@ -453,12 +428,11 @@ abstract class AbstractAspectJAdvisorFactoryTests {
void aspectMethodThrowsExceptionLegalOnSignature() { 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 = getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean")); aspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean"));
assertThat(advisors.size()).as("One advice method was found").isEqualTo(1); assertThat(advisors.size()).as("One advice method was found").isEqualTo(1);
ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); ITestBean itb = createProxy(target, ITestBean.class, advisors);
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy( assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(itb::getAge);
itb::getAge);
} }
// TODO document this behaviour. // TODO document this behaviour.
@ -467,39 +441,23 @@ abstract class AbstractAspectJAdvisorFactoryTests {
void aspectMethodThrowsExceptionIllegalOnSignature() { 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 = getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean")); aspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean"));
assertThat(advisors.size()).as("One advice method was found").isEqualTo(1); assertThat(advisors.size()).as("One advice method was found").isEqualTo(1);
ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); ITestBean itb = createProxy(target, ITestBean.class, advisors);
assertThatExceptionOfType(UndeclaredThrowableException.class).isThrownBy( assertThatExceptionOfType(UndeclaredThrowableException.class)
itb::getAge).withCause(expectedException); .isThrownBy(itb::getAge)
} .withCause(expectedException);
protected Object createProxy(Object target, List<Advisor> advisors, Class<?>... interfaces) {
ProxyFactory pf = new ProxyFactory(target);
if (interfaces.length > 1 || interfaces[0].isInterface()) {
pf.setInterfaces(interfaces);
}
else {
pf.setProxyTargetClass(true);
}
// Required everywhere we use AspectJ proxies
pf.addAdvice(ExposeInvocationInterceptor.INSTANCE);
pf.addAdvisors(advisors);
pf.setExposeProxy(true);
return pf.getProxy();
} }
@Test @Test
void twoAdvicesOnOneAspect() { 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 = getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(twoAdviceAspect, "someBean")); aspectInstanceFactory(twoAdviceAspect, "someBean"));
assertThat(advisors.size()).as("Two advice methods found").isEqualTo(2); assertThat(advisors.size()).as("Two advice methods found").isEqualTo(2);
ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); ITestBean itb = createProxy(target, ITestBean.class, advisors);
itb.setName(""); itb.setName("");
assertThat(itb.getAge()).isEqualTo(0); assertThat(itb.getAge()).isEqualTo(0);
int newAge = 32; int newAge = 32;
@ -510,40 +468,63 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@Test @Test
void afterAdviceTypes() throws Exception { void afterAdviceTypes() throws Exception {
InvocationTrackingAspect aspect = new InvocationTrackingAspect(); InvocationTrackingAspect aspect = new InvocationTrackingAspect();
List<Advisor> advisors = getFixture().getAdvisors( List<Advisor> advisors = getAdvisorFactory().getAdvisors(
new SingletonMetadataAwareAspectInstanceFactory(aspect, "exceptionHandlingAspect")); aspectInstanceFactory(aspect, "exceptionHandlingAspect"));
Echo echo = (Echo) createProxy(new Echo(), advisors, Echo.class); Echo echo = createProxy(new Echo(), Echo.class, advisors);
assertThat(aspect.invocations).isEmpty(); assertThat(aspect.invocations).isEmpty();
assertThat(echo.echo(42)).isEqualTo(42); assertThat(echo.echo(42)).isEqualTo(42);
assertThat(aspect.invocations).containsExactly("around - start", "before", "after returning", "after", "around - end"); assertThat(aspect.invocations).containsExactly("around - start", "before", "after returning", "after", "around - end");
aspect.invocations.clear(); aspect.invocations.clear();
assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(() -> echo.echo(new FileNotFoundException())); assertThatExceptionOfType(FileNotFoundException.class)
.isThrownBy(() -> echo.echo(new FileNotFoundException()));
assertThat(aspect.invocations).containsExactly("around - start", "before", "after throwing", "after", "around - end"); assertThat(aspect.invocations).containsExactly("around - start", "before", "after throwing", "after", "around - end");
} }
@Test @Test
void failureWithoutExplicitDeclarePrecedence() { void failureWithoutExplicitDeclarePrecedence() {
TestBean target = new TestBean(); TestBean target = new TestBean();
MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( MetadataAwareAspectInstanceFactory aspectInstanceFactory = aspectInstanceFactory(
new NoDeclarePrecedenceShouldFail(), "someBean"); new NoDeclarePrecedenceShouldFail(), "someBean");
ITestBean itb = (ITestBean) createProxy(target, ITestBean itb = createProxy(target, ITestBean.class, getAdvisorFactory().getAdvisors(aspectInstanceFactory));
getFixture().getAdvisors(aspectInstanceFactory), ITestBean.class); assertThat(itb.getAge()).isEqualTo(42);
itb.getAge();
} }
@Test @Test
void declarePrecedenceNotSupported() { void declarePrecedenceNotSupported() {
TestBean target = new TestBean(); TestBean target = new TestBean();
assertThatIllegalArgumentException().isThrownBy(() -> { assertThatIllegalArgumentException().isThrownBy(() -> {
MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( MetadataAwareAspectInstanceFactory aspectInstanceFactory = aspectInstanceFactory(
new DeclarePrecedenceShouldSucceed(), "someBean"); new DeclarePrecedenceShouldSucceed(), "someBean");
createProxy(target, getFixture().getAdvisors(aspectInstanceFactory), ITestBean.class); createProxy(target, ITestBean.class, getAdvisorFactory().getAdvisors(aspectInstanceFactory));
}); });
} }
private static MetadataAwareAspectInstanceFactory aspectInstanceFactory(Object aspectInstance, String aspectName) {
return new SingletonMetadataAwareAspectInstanceFactory(aspectInstance, aspectName);
}
@SuppressWarnings("unchecked")
private static <T> T createProxy(Object target, Class<T> type, List<Advisor> advisors) {
ProxyFactory pf = new ProxyFactory(target);
if (type.isInterface()) {
pf.addInterface(type);
}
else {
pf.setProxyTargetClass(true);
}
// Required everywhere we use AspectJ proxies
pf.addAdvice(ExposeInvocationInterceptor.INSTANCE);
pf.addAdvisors(advisors);
pf.setExposeProxy(true);
return (T) pf.getProxy();
}
@Aspect("percflow(execution(* *(..)))") @Aspect("percflow(execution(* *(..)))")
static class PerCflowAspect { static class PerCflowAspect {
} }
@ -758,11 +739,11 @@ abstract class AbstractAspectJAdvisorFactoryTests {
static class Echo { static class Echo {
Object echo(Object o) throws Exception { Object echo(Object obj) throws Exception {
if (o instanceof Exception) { if (obj instanceof Exception ex) {
throw (Exception) o; throw ex;
} }
return o; return obj;
} }
} }
@ -824,7 +805,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@Around("getAge()") @Around("getAge()")
int preventExecution(ProceedingJoinPoint pjp) { int preventExecution(ProceedingJoinPoint pjp) {
return 666; return 42;
} }
} }
@ -844,7 +825,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@Around("getAge()") @Around("getAge()")
int preventExecution(ProceedingJoinPoint pjp) { int preventExecution(ProceedingJoinPoint pjp) {
return 666; return 42;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2020 the original author or authors. * Copyright 2002-2023 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.
@ -27,7 +27,7 @@ package org.springframework.aop.aspectj.annotation;
class ReflectiveAspectJAdvisorFactoryTests extends AbstractAspectJAdvisorFactoryTests { class ReflectiveAspectJAdvisorFactoryTests extends AbstractAspectJAdvisorFactoryTests {
@Override @Override
protected AspectJAdvisorFactory getFixture() { protected AspectJAdvisorFactory getAdvisorFactory() {
return new ReflectiveAspectJAdvisorFactory(); return new ReflectiveAspectJAdvisorFactory();
} }