[SPR-7960] resolveActivatedProfiles() now resolves a unique set of activated profiles

This commit is contained in:
Sam Brannen 2011-06-01 12:56:50 +00:00
parent 13b7f1a31b
commit f64344b296
2 changed files with 35 additions and 20 deletions

View File

@ -18,8 +18,9 @@ package org.springframework.test.context;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -228,7 +229,7 @@ abstract class ContextLoaderUtils {
annotationType, clazz));
}
List<String> profilesList = new ArrayList<String>();
final Set<String> activeProfiles = new LinkedHashSet<String>();
while (declaringClass != null) {
ActivateProfiles activateProfiles = declaringClass.getAnnotation(annotationType);
@ -253,19 +254,9 @@ abstract class ContextLoaderUtils {
profiles = valueProfiles;
}
if (!ObjectUtils.isEmpty(profiles)) {
// Preserve the order in which the profiles were declared by
// reversing the array. This is necessary since we prepend each
// non-empty element to the aggregated list as we traverse the
// class hierarchy. Note that the following works because
// Arrays.asList() "writes through" to the underlying array.
Collections.reverse(Arrays.<String> asList(profiles));
for (String profile : profiles) {
if (StringUtils.hasText(profile)) {
profilesList.add(0, profile);
}
for (String profile : profiles) {
if (StringUtils.hasText(profile)) {
activeProfiles.add(profile);
}
}
@ -273,7 +264,7 @@ abstract class ContextLoaderUtils {
annotationType, declaringClass.getSuperclass()) : null;
}
return profilesList.toArray(new String[profilesList.size()]);
return StringUtils.toStringArray(activeProfiles);
}

View File

@ -18,6 +18,10 @@ package org.springframework.test.context;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
@ -50,6 +54,18 @@ public class ContextLoaderUtilsTests {
assertEquals(0, profiles.length);
}
@Test
public void resolveActivatedProfilesWithDuplicatedProfiles() {
String[] profiles = ContextLoaderUtils.resolveActivatedProfiles(DuplicatedProfiles.class);
assertNotNull(profiles);
assertEquals(3, profiles.length);
List<String> list = Arrays.asList(profiles);
assertTrue(list.contains("foo"));
assertTrue(list.contains("bar"));
assertTrue(list.contains("baz"));
}
@Test
public void resolveActivatedProfilesWithLocalAnnotation() {
String[] profiles = ContextLoaderUtils.resolveActivatedProfiles(Foo.class);
@ -71,8 +87,10 @@ public class ContextLoaderUtilsTests {
String[] profiles = ContextLoaderUtils.resolveActivatedProfiles(Bar.class);
assertNotNull(profiles);
assertEquals(2, profiles.length);
assertEquals("foo", profiles[0]);
assertEquals("bar", profiles[1]);
List<String> list = Arrays.asList(profiles);
assertTrue(list.contains("foo"));
assertTrue(list.contains("bar"));
}
@Test
@ -80,8 +98,10 @@ public class ContextLoaderUtilsTests {
String[] profiles = ContextLoaderUtils.resolveActivatedProfiles(Animals.class);
assertNotNull(profiles);
assertEquals(2, profiles.length);
assertEquals("dog", profiles[0]);
assertEquals("cat", profiles[1]);
List<String> list = Arrays.asList(profiles);
assertTrue(list.contains("dog"));
assertTrue(list.contains("cat"));
}
@ -96,6 +116,10 @@ public class ContextLoaderUtilsTests {
private static class EmptyProfiles {
}
@ActivateProfiles({ "foo", "bar", "foo", "bar", "baz" })
private static class DuplicatedProfiles {
}
@ActivateProfiles(profiles = "foo")
private static class Foo {
}