2012-04-20 10 views
11

ho una definizione di fagioli XML Primavera che voglio scrivere test di integrazione per. La definizione del bean XML fa parte di un contesto applicativo più ampio in cui diversi file di questo tipo sono inclusi utilizzando <import>. All'interno della definizione, faccio riferimento a diversi bean che provengono da altri file.esemplificazione finto automatico in un test JUnit primavera

Per il mio test di integrazione vorrei un'istanza autonoma definizione e l'uso Mockito prende in giro per tutti gli altri fagioli. Fino ad ora, sto usando qualcosa di simile:

FooIntegrationTest.java

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class FooIntegrationTest { 
    @Autowired private ClassUnderTest underTest; 
    @Autowired private MockedClass mock; 

    @Test 
    public void testFoo() { 
    } 
} 

FooIntegrationTest-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <import resource="part-to-test.xml" /> 

    <bean id="mockedClassReferencedByName" class="org.mockito.Mockito" factory-method="mock" c:classToMock="SomeMockedClass" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="OtherMockedClassReferencedByType" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="MockedClass" /> 
    ... 
</beans> 

vorrei automatizzare la sezione beffardo piuttosto noioso : Idealmente, mi piacerebbe avere tutti i bean che non si trovano nel contesto dell'applicazione per essere derisi automaticamente. Il utilizza @Autowired e i bean impostati utilizzando i riferimenti ai nomi. Uso solo i file di definizione del bean XML e non utilizzo né le classi @Configuration né le annotazioni @Component.

Ho esaminato come utilizzare un caricatore di contesto personalizzato in @ContextConfiguration(loader=...), ma non ho ancora trovato un punto di estensione appropriato per farlo. Sprinockito non sembra affrontare questo problema.

C'è qualche altro progetto là fuori che risolve già questo problema? In caso contrario, dove estenderei Spring per creare automaticamente i mock?

+0

Hai provato l'annotazione di Mockito @InjectMocks? In che modo non soddisfa le tue esigenze? –

+0

@DavidWallace '@ InjectMocks' funziona molto bene per i test unitari, ovvero test di una particolare classe in cui il test utilizza oggetti fittati. Tuttavia, mi piacerebbe prendere in giro tutti gli oggetti a cui si fa riferimento in una definizione di bean Spring. Ciò significa che ho bisogno di popolare il contesto dell'applicazione Spring con i nomi (possibilmente denominati) - Non sono a conoscenza di come 'InjectMocks 'aiuti a fare ciò. –

+0

OK, ci penserò ancora un po '. –

risposta

3

Ecco un short article with a code example. Un'implementazione BeanDefinitionRegistryPostProcessor genera un oggetto fittizio per ogni definizione di bean mancante. La parte di generazione è fatta con un MocksFactory, qui è an example for such a factory.

+0

Questa risposta è stata il giusto punto di partenza per affrontare il problema: l'utilizzo di un 'BeanDefinitionRegistryPostProcessor' rende possibile l'introspezione delle definizioni dei bean per i bean mancanti. Ho esteso l'esempio di codice per occuparmi anche dei fagioli che sono stati iniettati usando setter, ma tale estensione è piuttosto banale. –

+0

Il secondo link è morto. RIPOSA IN PACE. vecchio articolo –

2

Nel caso in cui qualcuno è ancora interessato a questa domanda, mi hanno esteso il codice nell'articolo citato da Yves Martin con l'ereditarietà, il supporto per @Inject, ecc ... e ha creato un progetto GitHub qui: https://github.com/rinoto/spring-auto-mock