Protect against non-deterministic method order in JDK7
- Allow reset of GlobalAdvisorAdapterRegistry Provide a reset() method allowing the GlobalAdvisorAdapterRegistry instance to be replaced with a fresh instance. This method has primarily been added to allow unit tests to leave the registry in a known state. - Protect against the fact that calls to configuration class methods my occur in a random order. Issue: SPR-9779
This commit is contained in:
parent
8e7622bb8a
commit
a9a90cabad
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -21,6 +21,7 @@ package org.springframework.aop.framework.adapter;
|
|||
*
|
||||
* @author Rod Johnson
|
||||
* @author Juergen Hoeller
|
||||
* @author Phillip Webb
|
||||
* @see DefaultAdvisorAdapterRegistry
|
||||
*/
|
||||
public abstract class GlobalAdvisorAdapterRegistry {
|
||||
|
@ -28,13 +29,22 @@ public abstract class GlobalAdvisorAdapterRegistry {
|
|||
/**
|
||||
* Keep track of a single instance so we can return it to classes that request it.
|
||||
*/
|
||||
private static final AdvisorAdapterRegistry instance = new DefaultAdvisorAdapterRegistry();
|
||||
private static AdvisorAdapterRegistry instance = new DefaultAdvisorAdapterRegistry();
|
||||
|
||||
/**
|
||||
* Return the singleton DefaultAdvisorAdapterRegistry instance.
|
||||
* Return the singleton {@link DefaultAdvisorAdapterRegistry} instance.
|
||||
*/
|
||||
public static AdvisorAdapterRegistry getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the singleton {@link DefaultAdvisorAdapterRegistry}, removing any
|
||||
* {@link AdvisorAdapterRegistry#registerAdvisorAdapter(AdvisorAdapter) registered}
|
||||
* adapters.
|
||||
*/
|
||||
static void reset() {
|
||||
instance = new DefaultAdvisorAdapterRegistry();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -23,6 +23,8 @@ import java.io.Serializable;
|
|||
import org.aopalliance.aop.Advice;
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
import org.aopalliance.intercept.MethodInvocation;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.aop.Advisor;
|
||||
import org.springframework.aop.BeforeAdvice;
|
||||
|
@ -38,6 +40,12 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
|
|||
*/
|
||||
public final class AdvisorAdapterRegistrationTests {
|
||||
|
||||
@Before
|
||||
@After
|
||||
public void resetGlobalAdvisorAdapterRegistry() {
|
||||
GlobalAdvisorAdapterRegistry.reset();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAdvisorAdapterRegistrationManagerNotPresentInContext() {
|
||||
ClassPathXmlApplicationContext ctx =
|
||||
|
@ -127,5 +135,4 @@ final class SimpleBeforeAdviceInterceptor implements MethodInterceptor {
|
|||
advice.before();
|
||||
return mi.proceed();
|
||||
}
|
||||
|
||||
}
|
|
@ -16,11 +16,13 @@
|
|||
|
||||
package org.springframework.test.context.junit4.spr9051;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.junit.Test;
|
||||
|
@ -30,6 +32,7 @@ import org.springframework.context.annotation.Bean;
|
|||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
|
||||
/**
|
||||
* This set of tests refutes the claims made in
|
||||
* <a href="https://jira.springsource.org/browse/SPR-9051" target="_blank">SPR-9051</a>.
|
||||
|
@ -46,6 +49,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|||
* </blockquote>
|
||||
*
|
||||
* @author Sam Brannen
|
||||
* @author Phillip Webb
|
||||
* @since 3.2
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
|
@ -85,18 +89,14 @@ public class AnnotatedConfigClassesWithoutAtConfigurationTests {
|
|||
@Autowired
|
||||
private LifecycleBean lifecycleBean;
|
||||
|
||||
|
||||
@Test
|
||||
public void simpleStringBean() {
|
||||
public void testSPR_9051() throws Exception {
|
||||
assertNotNull(enigma);
|
||||
assertEquals("enigma #1", enigma);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void beanWithLifecycleCallback() {
|
||||
assertNotNull(lifecycleBean);
|
||||
assertEquals("enigma #2", lifecycleBean.getName());
|
||||
assertTrue(lifecycleBean.isInitialized());
|
||||
Set<String> names = new HashSet<String>();
|
||||
names.add(enigma.toString());
|
||||
names.add(lifecycleBean.getName());
|
||||
assertEquals(names, new HashSet<String>(Arrays.asList("enigma #1", "enigma #2")));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue