diff --git a/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java b/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java index 625aeef9102..c2aa7762e6b 100644 --- a/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java +++ b/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java @@ -26,6 +26,7 @@ import org.springframework.test.context.ContextConfigurationAttributes; import org.springframework.test.context.ContextLoader; import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.SmartContextLoader; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; /** @@ -59,14 +60,20 @@ public class DelegatingSmartContextLoader implements SmartContextLoader { return false; } + /** + * TODO Document emptyResources(). + */ + private boolean emptyResources(ContextConfigurationAttributes configAttributes) { + return ObjectUtils.isEmpty(configAttributes.getLocations()) + && ObjectUtils.isEmpty(configAttributes.getClasses()); + } + /** * TODO Document processContextConfiguration() implementation. */ public void processContextConfiguration(ContextConfigurationAttributes configAttributes) { - final String[] originalLocations = configAttributes.getLocations(); - final Class[] originalClasses = configAttributes.getClasses(); - final boolean emptyResources = ObjectUtils.isEmpty(originalLocations) && ObjectUtils.isEmpty(originalClasses); + final boolean emptyResources = emptyResources(configAttributes); for (SmartContextLoader loader : candidates) { if (logger.isDebugEnabled()) { @@ -74,42 +81,43 @@ public class DelegatingSmartContextLoader implements SmartContextLoader { loader.getClass().getName(), configAttributes)); } - // TODO Implement processContextConfiguration(). - // - // If the original locations and classes are not empty, there's no + // If the original locations and classes were not empty, there's no // need to bother with default generation checks; just let each // loader process the configuration. if (!emptyResources) { loader.processContextConfiguration(configAttributes); } - // Otherwise, if a loader claims to generate defaults, let it - // process the configuration, and then verify that it actually did - // generate defaults. - // - // If it generated defaults, there's no need to delegate to - // additional candidates. So: - // 1) stop iterating - // 2) mark the current loader as the winning candidate (?) - // 3) log an info message. - else { - if (loader.generatesDefaults()) { - loader.processContextConfiguration(configAttributes); + // Otherwise, if the loader claims to generate defaults, let it + // process the configuration. + else if (loader.generatesDefaults()) { + loader.processContextConfiguration(configAttributes); + if (!emptyResources(configAttributes) && logger.isInfoEnabled()) { + logger.info(String.format("SmartContextLoader candidate %s " + + "generated defaults for context configuration [%s].", loader, configAttributes)); } } } + // If any loader claims to generate defaults but none actually did, // throw an exception. + if (generatesDefaults() && emptyResources(configAttributes)) { + throw new IllegalStateException(String.format("None of the SmartContextLoader candidates %s " + + "was able to generate defaults for context configuration [%s].", candidates, configAttributes)); + } } /** * TODO Document supports(MergedContextConfiguration) implementation. */ public boolean supports(MergedContextConfiguration mergedConfig) { + Assert.notNull(mergedConfig, "mergedConfig must not be null"); + for (SmartContextLoader loader : candidates) { if (loader.supports(mergedConfig)) { return true; } } + return false; } @@ -117,6 +125,7 @@ public class DelegatingSmartContextLoader implements SmartContextLoader { * TODO Document loadContext(MergedContextConfiguration) implementation. */ public ApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception { + Assert.notNull(mergedConfig, "mergedConfig must not be null"); for (SmartContextLoader loader : candidates) { diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/TestContextManagerTests.java b/org.springframework.test/src/test/java/org/springframework/test/context/TestContextManagerTests.java index 5fb0436e938..5b76b650bbc 100644 --- a/org.springframework.test/src/test/java/org/springframework/test/context/TestContextManagerTests.java +++ b/org.springframework.test/src/test/java/org/springframework/test/context/TestContextManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2011 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. @@ -53,9 +53,13 @@ public class TestContextManagerTests { protected static final Log logger = LogFactory.getLog(TestContextManagerTests.class); - private TestContextManager testContextManager = null; + private final TestContextManager testContextManager = new TestContextManager(ExampleTestCase.class); + private Method getTestMethod() throws NoSuchMethodException { + return ExampleTestCase.class.getDeclaredMethod("exampleTestMethod", (Class[]) null); + } + /** * Asserts the execution order of 'before' and 'after' test method * calls on {@link TestExecutionListener listeners} registered for the @@ -108,16 +112,10 @@ public class TestContextManagerTests { @Before public void setUpTestContextManager() throws Throwable { - - final Method testMethod = ExampleTestCase.class.getDeclaredMethod("exampleTestMethod", (Class[]) null); - this.testContextManager = new TestContextManager(ExampleTestCase.class); - this.testContextManager.registerTestExecutionListeners(new NamedTestExecutionListener(FIRST), - new NamedTestExecutionListener(SECOND), new NamedTestExecutionListener(THIRD)); - - assertEquals("Verifying the number of registered TestExecutionListeners.", 6, + assertEquals("Verifying the number of registered TestExecutionListeners.", 3, this.testContextManager.getTestExecutionListeners().size()); - this.testContextManager.beforeTestMethod(new ExampleTestCase(), testMethod); + this.testContextManager.beforeTestMethod(new ExampleTestCase(), getTestMethod()); } /** @@ -133,13 +131,11 @@ public class TestContextManagerTests { @After public void tearDownTestContextManager() throws Throwable { - final Method testMethod = ExampleTestCase.class.getDeclaredMethod("exampleTestMethod", (Class[]) null); - this.testContextManager.afterTestMethod(new ExampleTestCase(), testMethod, null); - this.testContextManager = null; + this.testContextManager.afterTestMethod(new ExampleTestCase(), getTestMethod(), null); } - @ContextConfiguration + @TestExecutionListeners({ FirstTel.class, SecondTel.class, ThirdTel.class }) private static class ExampleTestCase { @SuppressWarnings("unused") @@ -158,13 +154,13 @@ public class TestContextManagerTests { } @Override - public void afterTestMethod(final TestContext testContext) { - afterTestMethodCalls.add(this.name); + public void beforeTestMethod(final TestContext testContext) { + beforeTestMethodCalls.add(this.name); } @Override - public void beforeTestMethod(final TestContext testContext) { - beforeTestMethodCalls.add(this.name); + public void afterTestMethod(final TestContext testContext) { + afterTestMethodCalls.add(this.name); } @Override @@ -173,4 +169,25 @@ public class TestContextManagerTests { } } + private static class FirstTel extends NamedTestExecutionListener { + + public FirstTel() { + super(FIRST); + } + } + + private static class SecondTel extends NamedTestExecutionListener { + + public SecondTel() { + super(SECOND); + } + } + + private static class ThirdTel extends NamedTestExecutionListener { + + public ThirdTel() { + super(THIRD); + } + } + } diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/support/DelegatingSmartContextLoaderTests.java b/org.springframework.test/src/test/java/org/springframework/test/context/support/DelegatingSmartContextLoaderTests.java index 13fccfe1906..c482149cae2 100644 --- a/org.springframework.test/src/test/java/org/springframework/test/context/support/DelegatingSmartContextLoaderTests.java +++ b/org.springframework.test/src/test/java/org/springframework/test/context/support/DelegatingSmartContextLoaderTests.java @@ -30,8 +30,8 @@ import org.springframework.test.context.MergedContextConfiguration; */ public class DelegatingSmartContextLoaderTests { - private static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; private static final String[] EMPTY_STRING_ARRAY = new String[0]; + private static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; private final DelegatingSmartContextLoader loader = new DelegatingSmartContextLoader(); @@ -48,6 +48,12 @@ public class DelegatingSmartContextLoaderTests { // TODO test processContextConfiguration(). } + @Test(expected = IllegalArgumentException.class) + public void doesNotSupportNullConfig() { + MergedContextConfiguration mergedConfig = null; + loader.supports(mergedConfig); + } + @Test public void doesNotSupportEmptyConfig() { MergedContextConfiguration mergedConfig = new MergedContextConfiguration(getClass(), EMPTY_STRING_ARRAY, @@ -76,6 +82,19 @@ public class DelegatingSmartContextLoaderTests { assertTrue(loader.supports(mergedConfig)); } + @Test(expected = IllegalArgumentException.class) + public void loadContextWithNullConfig() throws Exception { + MergedContextConfiguration mergedConfig = null; + loader.loadContext(mergedConfig); + } + + @Test(expected = IllegalStateException.class) + public void loadContextWithoutLocationsAndConfigurationClasses() throws Exception { + MergedContextConfiguration mergedConfig = new MergedContextConfiguration(getClass(), EMPTY_STRING_ARRAY, + EMPTY_CLASS_ARRAY, EMPTY_STRING_ARRAY, loader); + loader.loadContext(mergedConfig); + } + @Test public void loadContext() { // TODO test loadContext().