2015-01-16 11 views
11

ich folgende Test geschrieben haben:nicht verarbeiten können Standorte und Klassen für die Kontextkonfiguration

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:META-INF/dataContext.xml"},classes = Configiuration.class) 
@ActiveProfiles("test") 
public class CityDaoImplTest { 
.... 
} 

I Konfiguration von XML-Datei verwenden müssen, und von Java-Klasse bur, wenn ich

mvn Test rufe ich folgende seee in Konsole:

Tests in error: 
    initializationError(***.CityDaoImplTest): Cannot process locations AND classes for context configuration [[email protected] declaringClass = '***.CityDaoImplTest', classes = '{***.Configiuration}', locations = '{classpath:META-INF/dataContext.xml}', inheritLocations = true, initializers = '{}', inheritInitializers = true, name = [null], contextLoaderClass = 'org.springframework.test.context.ContextLoader']; configure one or the other, but not both. 

Wie es zu beheben, ohne die Konfiguration neu zu schreiben?

Antwort

29

Vom Spring Docs:

Vor 3,1 bis Frühling, nur pfadbasierte Ressource Standorte wurden unterstützt. Ab Frühling 3.1 können Kontextlader auswählen, entweder pfadbasierte oder klassenbasierte Ressourcen zu unterstützen. Ab Frühjahr 4.0.4 können Kontextlader auswählen, die pfadbasierten Klassenressourcen und gleichzeitig zu unterstützen.

Allerdings gibt es beim Federtest einen kleinen Vorbehalt. Es nutzt die SmartContextLoader, die auf AbstractDelegatingSmartContextLoader basiert und leider ist es nicht so klug;)

@Override 
public void processContextConfiguration(
     final ContextConfigurationAttributes configAttributes) { 

    Assert.notNull(configAttributes, "configAttributes must not be null"); 
    Assert.isTrue(!(configAttributes.hasLocations() && configAttributes.hasClasses()), String.format(
     "Cannot process locations AND classes for context " 
       + "configuration %s; configure one or the other, but not both.", configAttributes)); 

Wie in den Code, Orte gezeigt und Klassen können nicht beide eingestellt werden.

Also, wie das zu beheben? Nun, eine Lösung ist eine zusätzliche Konfigurationsklasse wie die folgenden hinzuzufügen:

@Configuration 
@ImportResource("classpath:META-INF/dataContext.xml") 
class TestConfig { 

} 

Und in Ihrem Testcode verwenden Sie die folgende:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {Configuration.class, TestConfig.class}) 
@ActiveProfiles("test") 
public class CityDaoImplTest { ... } 

Technisch ist dies Umschreiben der Konfiguration aber Sie müssen Ihre bestehende Konfiguration nicht ändern, fügen Sie einfach eine neue Klasse hinzu (und diese Klasse kann sogar in der gleichen Datei sein wie Ihr Testfall).

+1

von meinem pom: 4.0.7.RELEASE gstackoverflow

0

Auch wenn es zu spät für Sie ist, werde ich meine Antwort posten, nur um den anderen zu helfen, die das lesen werden.

Eine andere Lösung besteht darin, Ihre Configuuration-Klasse in der Datei "DataContext.xml" als Bean zu deklarieren.

Alles, was Sie tun müssen, ist:

<bean class="com.packageWhereConfigClassIsPresent.Configuration"/> 

Hoffe, dass es jemand helfen;)