2015-04-17 15 views
5

Ho un'applicazione Spring Boot con Spring Data Rest e io uso @WebIntegrationTest insieme allo TestRestTemplate nei test di integrazione. La classe base per i test simile a questa:Spring Boot @WebIntegrationTest e TestRestTemplate - È possibile eseguire il rollback delle transazioni di prova?

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles(profiles = "test") 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration 
@WebIntegrationTest("server.port: 0") 
public abstract class IntegrationTest { 

    ... 

} 

stavo testando la creazione di un'entità utilizzando il TestRestTemplate per eseguire una richiesta POST a una risorsa. Il problema è che la transazione che persiste sull'entità sul database non viene ripristinata anche se i miei test sono configurati come transazionali, quindi l'entità rimane sul database dopo il test. In un certo senso lo capisco perché la transazione che viene sottoposta a rollback nel test non è la stessa che persiste nell'entità.

Ora la mia domanda è: esiste un modo per ripristinare le transazioni attivate dalle richieste effettuate tramite RestTemplate in un metodo di prova?

+1

Direi di no, l'unico modo sarebbe quello di eliminare manualmente le voci aggiunte ... –

+0

FYI: è possibile eliminare la dichiarazione '@ TransactionConfiguration': qui ha effetto zero. –

risposta

16

c'è un modo di rollback delle transazioni innescate dalle richieste fatte attraverso il RestTemplate in un metodo di prova?

No. Non è possibile eseguire il rollback delle transazioni gestite dall'applicazione distribuita.

Quando si annota la classe di test con @WebIntegrationTest e @SpringApplicationConfiguration, Spring Boot avvierà un contenitore Servlet incorporato e distribuirà l'applicazione in esso. In questo senso, il test e l'applicazione sono eseguiti in due processi diversi.

Spring TestContext Framework gestisce solo Test-managed transactions. Pertanto, la presenza di @Transactional nella classe di test influenza solo le transazioni locali gestite dal test, non quelle in un processo diverso.

Come già indicato da qualcun altro, una soluzione sarebbe quella di ripristinare lo stato del database una volta completato il test. Per questo hai diverse opzioni. Consultare la sezione Executing SQL scripts del manuale di riferimento per i dettagli.

saluti,

Sam (autore della primavera TestContext quadro)

+0

Grazie per l'aiuto Sam. Ho pensato che fosse la risposta. Sto già ripristinando lo stato del database. Saluti. –

+0

Un'ultima domanda. Se il test e l'applicazione sono in esecuzione in due processi diversi, come è possibile iniettare i suoi componenti nella classe di test? –

+0

Quando ho detto "processo diverso", forse era un po 'fuorviante. Il contenitore incorporato e il test vengono eseguiti nello stesso processo JVM; tuttavia, il contenitore Servlet incorporato esegue naturalmente richieste in diversi thread dal proprio pool di thread. Poiché il supporto delle transazioni di Spring è basato su 'ThreadLocal's, la nozione di thread diversi è ciò che è importante per quanto riguarda i limiti delle transazioni. Il 'ApplicationContext', tuttavia, viene lanciato nel thread del test. Quindi i componenti del contesto possono essere iniettati nel test, anche se tali componenti sono eseguiti nei thread del contenitore. –

Problemi correlati