2015-01-16 15 views
11

ho scritto seguente test:non può elaborare posizioni e classi per la configurazione contesto

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

ho bisogno di utilizzare la configurazione dal file XML e dalla classe java fresa quando invoco

prova mvn ho seee seguendo console:

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. 

Come risolvere il problema senza riscrivere la configurazione?

risposta

29

Dal Spring Docs:

Prima di primavera 3.1, posizioni di risorse solo basati sul percorso sono stati sostenuti. A partire dalla primavera 3.1, i caricatori di contesto possono scegliere di supportare o basate su percorso o risorse basate su classi. A partire dalla Spring 4.0.4, i caricatori di contesto possono scegliere di supportare simultaneamente le risorse basate su percorso e class.

Tuttavia, con il test della molla è presente un piccolo avvertimento. Esso utilizza il SmartContextLoader che si basa su AbstractDelegatingSmartContextLoader e purtroppo non è così intelligente;)

@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)); 

Come illustrato nel codice, sedi e classi non possono essere entrambi impostati.

Quindi, come risolvere questo? Ebbene, una soluzione è quella di aggiungere una classe di configurazione extra come il seguente:

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

} 

E, nel codice di test utilizzare il seguente:

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

Tecnicamente, questo è riscrivere la configurazione ma non è necessario modificare la configurazione esistente, basta aggiungere una nuova classe @Configuration (e quella classe può anche essere nello stesso file del caso di test).

+1

dal mio pom: 4.0.7.RELEASE gstackoverflow

0

Anche se è in ritardo per voi, invierò la mia risposta solo per aiutare gli altri a leggerlo.

Un'altra soluzione è dichiarare la classe Configiuration come bean in dataContext.xml.

Tutto quello che dovete fare è:

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

auguro che possa aiutare qualcuno;)

Problemi correlati