Skip to content

Commit 172c8b2

Browse files
committed
Polish AOP tests
1 parent 51956fa commit 172c8b2

File tree

2 files changed

+88
-84
lines changed

2 files changed

+88
-84
lines changed

spring-context/src/test/java/org/springframework/aop/aspectj/autoproxy/AspectJAutoProxyCreatorTests.java

+31-30
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class AspectJAutoProxyCreatorTests {
8585
void aspectsAreApplied() {
8686
ClassPathXmlApplicationContext bf = newContext("aspects.xml");
8787

88-
ITestBean tb = (ITestBean) bf.getBean("adrian");
88+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
8989
assertThat(tb.getAge()).isEqualTo(68);
9090
MethodInvokingFactoryBean factoryBean = (MethodInvokingFactoryBean) bf.getBean("&factoryBean");
9191
assertThat(AopUtils.isAopProxy(factoryBean.getTargetObject())).isTrue();
@@ -96,7 +96,7 @@ void aspectsAreApplied() {
9696
void multipleAspectsWithParameterApplied() {
9797
ClassPathXmlApplicationContext bf = newContext("aspects.xml");
9898

99-
ITestBean tb = (ITestBean) bf.getBean("adrian");
99+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
100100
tb.setAge(10);
101101
assertThat(tb.getAge()).isEqualTo(20);
102102
}
@@ -105,16 +105,16 @@ void multipleAspectsWithParameterApplied() {
105105
void aspectsAreAppliedInDefinedOrder() {
106106
ClassPathXmlApplicationContext bf = newContext("aspectsWithOrdering.xml");
107107

108-
ITestBean tb = (ITestBean) bf.getBean("adrian");
108+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
109109
assertThat(tb.getAge()).isEqualTo(71);
110110
}
111111

112112
@Test
113113
void aspectsAndAdvisorAreApplied() {
114114
ClassPathXmlApplicationContext ac = newContext("aspectsPlusAdvisor.xml");
115115

116-
ITestBean shouldBeWeaved = (ITestBean) ac.getBean("adrian");
117-
doTestAspectsAndAdvisorAreApplied(ac, shouldBeWeaved);
116+
ITestBean shouldBeWoven = ac.getBean("adrian", ITestBean.class);
117+
assertAspectsAndAdvisorAreApplied(ac, shouldBeWoven);
118118
}
119119

120120
@Test
@@ -124,20 +124,22 @@ void aspectsAndAdvisorAreAppliedEvenIfComingFromParentFactory() {
124124
GenericApplicationContext childAc = new GenericApplicationContext(ac);
125125
// Create a child factory with a bean that should be woven
126126
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
127-
bd.getPropertyValues().addPropertyValue(new PropertyValue("name", "Adrian"))
127+
bd.getPropertyValues()
128+
.addPropertyValue(new PropertyValue("name", "Adrian"))
128129
.addPropertyValue(new PropertyValue("age", 34));
129130
childAc.registerBeanDefinition("adrian2", bd);
130131
// Register the advisor auto proxy creator with subclass
131-
childAc.registerBeanDefinition(AnnotationAwareAspectJAutoProxyCreator.class.getName(), new RootBeanDefinition(
132-
AnnotationAwareAspectJAutoProxyCreator.class));
132+
childAc.registerBeanDefinition(AnnotationAwareAspectJAutoProxyCreator.class.getName(),
133+
new RootBeanDefinition(AnnotationAwareAspectJAutoProxyCreator.class));
133134
childAc.refresh();
134135

135-
ITestBean beanFromChildContextThatShouldBeWeaved = (ITestBean) childAc.getBean("adrian2");
136-
//testAspectsAndAdvisorAreApplied(childAc, (ITestBean) ac.getBean("adrian"));
137-
doTestAspectsAndAdvisorAreApplied(childAc, beanFromChildContextThatShouldBeWeaved);
136+
ITestBean beanFromParentContextThatShouldBeWoven = ac.getBean("adrian", ITestBean.class);
137+
ITestBean beanFromChildContextThatShouldBeWoven = childAc.getBean("adrian2", ITestBean.class);
138+
assertAspectsAndAdvisorAreApplied(childAc, beanFromParentContextThatShouldBeWoven);
139+
assertAspectsAndAdvisorAreApplied(childAc, beanFromChildContextThatShouldBeWoven);
138140
}
139141

140-
protected void doTestAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBean shouldBeWeaved) {
142+
protected void assertAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBean shouldBeWoven) {
141143
TestBeanAdvisor tba = (TestBeanAdvisor) ac.getBean("advisor");
142144

143145
MultiplyReturnValue mrv = (MultiplyReturnValue) ac.getBean("aspect");
@@ -146,10 +148,10 @@ protected void doTestAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBea
146148
tba.count = 0;
147149
mrv.invocations = 0;
148150

149-
assertThat(AopUtils.isAopProxy(shouldBeWeaved)).as("Autoproxying must apply from @AspectJ aspect").isTrue();
150-
assertThat(shouldBeWeaved.getName()).isEqualTo("Adrian");
151+
assertThat(AopUtils.isAopProxy(shouldBeWoven)).as("Autoproxying must apply from @AspectJ aspect").isTrue();
152+
assertThat(shouldBeWoven.getName()).isEqualTo("Adrian");
151153
assertThat(mrv.invocations).isEqualTo(0);
152-
assertThat(shouldBeWeaved.getAge()).isEqualTo((34 * mrv.getMultiple()));
154+
assertThat(shouldBeWoven.getAge()).isEqualTo((34 * mrv.getMultiple()));
153155
assertThat(tba.count).as("Spring advisor must be invoked").isEqualTo(2);
154156
assertThat(mrv.invocations).as("Must be able to hold state in aspect").isEqualTo(1);
155157
}
@@ -158,13 +160,13 @@ protected void doTestAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBea
158160
void perThisAspect() {
159161
ClassPathXmlApplicationContext bf = newContext("perthis.xml");
160162

161-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
163+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
162164
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
163165

164166
assertThat(adrian1.getAge()).isEqualTo(0);
165167
assertThat(adrian1.getAge()).isEqualTo(1);
166168

167-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
169+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
168170
assertThat(adrian2).isNotSameAs(adrian1);
169171
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
170172
assertThat(adrian2.getAge()).isEqualTo(0);
@@ -178,7 +180,7 @@ void perThisAspect() {
178180
void perTargetAspect() throws SecurityException, NoSuchMethodException {
179181
ClassPathXmlApplicationContext bf = newContext("pertarget.xml");
180182

181-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
183+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
182184
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
183185

184186
// Does not trigger advice or count
@@ -199,7 +201,7 @@ void perTargetAspect() throws SecurityException, NoSuchMethodException {
199201
adrian1.setName("Adrian");
200202
//assertEquals("Any other setter does not increment", 2, adrian1.getAge());
201203

202-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
204+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
203205
assertThat(adrian2).isNotSameAs(adrian1);
204206
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
205207
assertThat(adrian2.getAge()).isEqualTo(34);
@@ -239,17 +241,17 @@ void cglibProxyClassIsCachedAcrossApplicationContextsForPerTargetAspect() {
239241
void twoAdviceAspect() {
240242
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspect.xml");
241243

242-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
244+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
243245
testAgeAspect(adrian1, 0, 2);
244246
}
245247

246248
@Test
247249
void twoAdviceAspectSingleton() {
248250
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectSingleton.xml");
249251

250-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
252+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
251253
testAgeAspect(adrian1, 0, 1);
252-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
254+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
253255
assertThat(adrian2).isNotSameAs(adrian1);
254256
testAgeAspect(adrian2, 2, 1);
255257
}
@@ -258,9 +260,9 @@ void twoAdviceAspectSingleton() {
258260
void twoAdviceAspectPrototype() {
259261
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectPrototype.xml");
260262

261-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
263+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
262264
testAgeAspect(adrian1, 0, 1);
263-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
265+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
264266
assertThat(adrian2).isNotSameAs(adrian1);
265267
testAgeAspect(adrian2, 0, 1);
266268
}
@@ -280,7 +282,7 @@ private void testAgeAspect(ITestBean adrian, int start, int increment) {
280282
void adviceUsingJoinPoint() {
281283
ClassPathXmlApplicationContext bf = newContext("usesJoinPointAspect.xml");
282284

283-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
285+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
284286
adrian1.getAge();
285287
AdviceUsingThisJoinPoint aspectInstance = (AdviceUsingThisJoinPoint) bf.getBean("aspect");
286288
//(AdviceUsingThisJoinPoint) Aspects.aspectOf(AdviceUsingThisJoinPoint.class);
@@ -292,7 +294,7 @@ void adviceUsingJoinPoint() {
292294
void includeMechanism() {
293295
ClassPathXmlApplicationContext bf = newContext("usesInclude.xml");
294296

295-
ITestBean adrian = (ITestBean) bf.getBean("adrian");
297+
ITestBean adrian = bf.getBean("adrian", ITestBean.class);
296298
assertThat(AopUtils.isAopProxy(adrian)).isTrue();
297299
assertThat(adrian.getAge()).isEqualTo(68);
298300
}
@@ -310,7 +312,7 @@ void forceProxyTargetClass() {
310312
void withAbstractFactoryBeanAreApplied() {
311313
ClassPathXmlApplicationContext bf = newContext("aspectsWithAbstractBean.xml");
312314

313-
ITestBean adrian = (ITestBean) bf.getBean("adrian");
315+
ITestBean adrian = bf.getBean("adrian", ITestBean.class);
314316
assertThat(AopUtils.isAopProxy(adrian)).isTrue();
315317
assertThat(adrian.getAge()).isEqualTo(68);
316318
}
@@ -321,8 +323,7 @@ void retryAspect() {
321323

322324
UnreliableBean bean = (UnreliableBean) bf.getBean("unreliableBean");
323325
RetryAspect aspect = (RetryAspect) bf.getBean("retryAspect");
324-
int attempts = bean.unreliable();
325-
assertThat(attempts).isEqualTo(2);
326+
assertThat(bean.unreliable()).isEqualTo(2);
326327
assertThat(aspect.getBeginCalls()).isEqualTo(2);
327328
assertThat(aspect.getRollbackCalls()).isEqualTo(1);
328329
assertThat(aspect.getCommitCalls()).isEqualTo(1);
@@ -332,7 +333,7 @@ void retryAspect() {
332333
void withBeanNameAutoProxyCreator() {
333334
ClassPathXmlApplicationContext bf = newContext("withBeanNameAutoProxyCreator.xml");
334335

335-
ITestBean tb = (ITestBean) bf.getBean("adrian");
336+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
336337
assertThat(tb.getAge()).isEqualTo(68);
337338
}
338339

spring-tx/src/test/java/org/springframework/transaction/interceptor/BeanFactoryTransactionTests.java

+57-54
Original file line numberDiff line numberDiff line change
@@ -56,59 +56,54 @@
5656
*/
5757
class BeanFactoryTransactionTests {
5858

59-
private DefaultListableBeanFactory factory;
59+
private final DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
6060

6161

6262
@BeforeEach
63-
void setUp() {
64-
this.factory = new DefaultListableBeanFactory();
63+
void loadBeanDefinitions() {
6564
new XmlBeanDefinitionReader(this.factory).loadBeanDefinitions(
6665
new ClassPathResource("transactionalBeanFactory.xml", getClass()));
6766
}
6867

6968

7069
@Test
71-
void testGetsAreNotTransactionalWithProxyFactory1() {
72-
ITestBean testBean = (ITestBean) factory.getBean("proxyFactory1");
70+
void getsAreNotTransactionalWithProxyFactory1() {
71+
ITestBean testBean = factory.getBean("proxyFactory1", ITestBean.class);
7372
assertThat(Proxy.isProxyClass(testBean.getClass())).as("testBean is a dynamic proxy").isTrue();
74-
boolean condition = testBean instanceof TransactionalProxy;
75-
assertThat(condition).isFalse();
76-
doTestGetsAreNotTransactional(testBean);
73+
assertThat(testBean).isNotInstanceOf(TransactionalProxy.class);
74+
assertGetsAreNotTransactional(testBean);
7775
}
7876

7977
@Test
80-
void testGetsAreNotTransactionalWithProxyFactory2DynamicProxy() {
78+
void getsAreNotTransactionalWithProxyFactory2DynamicProxy() {
8179
this.factory.preInstantiateSingletons();
82-
ITestBean testBean = (ITestBean) factory.getBean("proxyFactory2DynamicProxy");
80+
ITestBean testBean = factory.getBean("proxyFactory2DynamicProxy", ITestBean.class);
8381
assertThat(Proxy.isProxyClass(testBean.getClass())).as("testBean is a dynamic proxy").isTrue();
84-
boolean condition = testBean instanceof TransactionalProxy;
85-
assertThat(condition).isTrue();
86-
doTestGetsAreNotTransactional(testBean);
82+
assertThat(testBean).isInstanceOf(TransactionalProxy.class);
83+
assertGetsAreNotTransactional(testBean);
8784
}
8885

8986
@Test
90-
void testGetsAreNotTransactionalWithProxyFactory2Cglib() {
91-
ITestBean testBean = (ITestBean) factory.getBean("proxyFactory2Cglib");
87+
void getsAreNotTransactionalWithProxyFactory2Cglib() {
88+
ITestBean testBean = factory.getBean("proxyFactory2Cglib", ITestBean.class);
9289
assertThat(AopUtils.isCglibProxy(testBean)).as("testBean is CGLIB advised").isTrue();
93-
boolean condition = testBean instanceof TransactionalProxy;
94-
assertThat(condition).isTrue();
95-
doTestGetsAreNotTransactional(testBean);
90+
assertThat(testBean).isInstanceOf(TransactionalProxy.class);
91+
assertGetsAreNotTransactional(testBean);
9692
}
9793

9894
@Test
99-
void testProxyFactory2Lazy() {
100-
ITestBean testBean = (ITestBean) factory.getBean("proxyFactory2Lazy");
95+
void proxyFactory2Lazy() {
96+
ITestBean testBean = factory.getBean("proxyFactory2Lazy", ITestBean.class);
10197
assertThat(factory.containsSingleton("target")).isFalse();
10298
assertThat(testBean.getAge()).isEqualTo(666);
10399
assertThat(factory.containsSingleton("target")).isTrue();
104100
}
105101

106102
@Test
107-
void testCglibTransactionProxyImplementsNoInterfaces() {
108-
ImplementsNoInterfaces ini = (ImplementsNoInterfaces) factory.getBean("cglibNoInterfaces");
103+
void cglibTransactionProxyImplementsNoInterfaces() {
104+
ImplementsNoInterfaces ini = factory.getBean("cglibNoInterfaces", ImplementsNoInterfaces.class);
109105
assertThat(AopUtils.isCglibProxy(ini)).as("testBean is CGLIB advised").isTrue();
110-
boolean condition = ini instanceof TransactionalProxy;
111-
assertThat(condition).isTrue();
106+
assertThat(ini).isInstanceOf(TransactionalProxy.class);
112107
String newName = "Gordon";
113108

114109
// Install facade
@@ -121,31 +116,41 @@ void testCglibTransactionProxyImplementsNoInterfaces() {
121116
}
122117

123118
@Test
124-
void testGetsAreNotTransactionalWithProxyFactory3() {
125-
ITestBean testBean = (ITestBean) factory.getBean("proxyFactory3");
126-
boolean condition = testBean instanceof DerivedTestBean;
127-
assertThat(condition).as("testBean is a full proxy").isTrue();
128-
boolean condition1 = testBean instanceof TransactionalProxy;
129-
assertThat(condition1).isTrue();
130-
InvocationCounterPointcut txnCounter = (InvocationCounterPointcut) factory.getBean("txnInvocationCounterPointcut");
131-
InvocationCounterInterceptor preCounter = (InvocationCounterInterceptor) factory.getBean("preInvocationCounterInterceptor");
132-
InvocationCounterInterceptor postCounter = (InvocationCounterInterceptor) factory.getBean("postInvocationCounterInterceptor");
133-
txnCounter.counter = 0;
134-
preCounter.counter = 0;
135-
postCounter.counter = 0;
136-
doTestGetsAreNotTransactional(testBean);
137-
// Can't assert it's equal to 4 as the pointcut may be optimized and only invoked once
138-
assertThat(0 < txnCounter.counter && txnCounter.counter <= 4).isTrue();
139-
assertThat(preCounter.counter).isEqualTo(4);
140-
assertThat(postCounter.counter).isEqualTo(4);
119+
void getsAreNotTransactionalWithProxyFactory3() {
120+
ITestBean testBean = factory.getBean("proxyFactory3", ITestBean.class);
121+
assertThat(testBean).as("testBean is a full proxy")
122+
.isInstanceOf(DerivedTestBean.class)
123+
.isInstanceOf(TransactionalProxy.class);
124+
125+
InvocationCounterPointcut txnPointcut = factory.getBean("txnInvocationCounterPointcut", InvocationCounterPointcut.class);
126+
InvocationCounterInterceptor preInterceptor = factory.getBean("preInvocationCounterInterceptor", InvocationCounterInterceptor.class);
127+
InvocationCounterInterceptor postInterceptor = factory.getBean("postInvocationCounterInterceptor", InvocationCounterInterceptor.class);
128+
assertThat(txnPointcut.counter).as("txnPointcut").isGreaterThan(0);
129+
assertThat(preInterceptor.counter).as("preInterceptor").isZero();
130+
assertThat(postInterceptor.counter).as("postInterceptor").isZero();
131+
132+
// Reset counters
133+
txnPointcut.counter = 0;
134+
preInterceptor.counter = 0;
135+
postInterceptor.counter = 0;
136+
137+
// Invokes: getAge() * 2 and setAge() * 1 --> 2 + 1 = 3 method invocations.
138+
assertGetsAreNotTransactional(testBean);
139+
140+
// The transaction pointcut is currently asked if it matches() for all method
141+
// invocations, but we cannot assert it's equal to 3 since the pointcut may be
142+
// optimized and only invoked once.
143+
assertThat(txnPointcut.counter).as("txnPointcut").isGreaterThanOrEqualTo(1).isLessThanOrEqualTo(3);
144+
assertThat(preInterceptor.counter).as("preInterceptor").isEqualTo(3);
145+
assertThat(postInterceptor.counter).as("postInterceptor").isEqualTo(3);
141146
}
142147

143-
private void doTestGetsAreNotTransactional(final ITestBean testBean) {
148+
private void assertGetsAreNotTransactional(final ITestBean testBean) {
144149
// Install facade
145150
PlatformTransactionManager ptm = mock();
146151
PlatformTransactionManagerFacade.delegate = ptm;
147152

148-
assertThat(testBean.getAge()).as("Age should not be " + testBean.getAge()).isEqualTo(666);
153+
assertThat(testBean.getAge()).as("Age").isEqualTo(666);
149154

150155
// Expect no methods
151156
verifyNoInteractions(ptm);
@@ -177,14 +182,14 @@ public void rollback(TransactionStatus status) throws TransactionException {
177182
};
178183
PlatformTransactionManagerFacade.delegate = ptm;
179184

180-
// TODO same as old age to avoid ordering effect for now
185+
// same as old age to avoid ordering effect for now
181186
int age = 666;
182187
testBean.setAge(age);
183188
assertThat(testBean.getAge()).isEqualTo(age);
184189
}
185190

186191
@Test
187-
void testGetBeansOfTypeWithAbstract() {
192+
void getBeansOfTypeWithAbstract() {
188193
Map<String, ITestBean> beansOfType = factory.getBeansOfType(ITestBean.class, true, true);
189194
assertThat(beansOfType).isNotNull();
190195
}
@@ -193,32 +198,30 @@ void testGetBeansOfTypeWithAbstract() {
193198
* Check that we fail gracefully if the user doesn't set any transaction attributes.
194199
*/
195200
@Test
196-
void testNoTransactionAttributeSource() {
197-
assertThatExceptionOfType(FatalBeanException.class).isThrownBy(() -> {
198-
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
199-
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(new ClassPathResource("noTransactionAttributeSource.xml", getClass()));
200-
bf.getBean("noTransactionAttributeSource");
201-
});
201+
void noTransactionAttributeSource() {
202+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
203+
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(new ClassPathResource("noTransactionAttributeSource.xml", getClass()));
204+
assertThatExceptionOfType(FatalBeanException.class).isThrownBy(() -> bf.getBean("noTransactionAttributeSource"));
202205
}
203206

204207
/**
205208
* Test that we can set the target to a dynamic TargetSource.
206209
*/
207210
@Test
208-
void testDynamicTargetSource() {
211+
void dynamicTargetSource() {
209212
// Install facade
210213
CallCountingTransactionManager txMan = new CallCountingTransactionManager();
211214
PlatformTransactionManagerFacade.delegate = txMan;
212215

213-
TestBean tb = (TestBean) factory.getBean("hotSwapped");
216+
TestBean tb = factory.getBean("hotSwapped", TestBean.class);
214217
assertThat(tb.getAge()).isEqualTo(666);
215218
int newAge = 557;
216219
tb.setAge(newAge);
217220
assertThat(tb.getAge()).isEqualTo(newAge);
218221

219222
TestBean target2 = new TestBean();
220223
target2.setAge(65);
221-
HotSwappableTargetSource ts = (HotSwappableTargetSource) factory.getBean("swapper");
224+
HotSwappableTargetSource ts = factory.getBean("swapper", HotSwappableTargetSource.class);
222225
ts.swap(target2);
223226
assertThat(tb.getAge()).isEqualTo(target2.getAge());
224227
tb.setAge(newAge);

0 commit comments

Comments
 (0)