2012-01-13 14 views
5

In un test JUnit nella mia applicazione Spring, vorrei inserire molti dati in un metodo di installazione, quindi utilizzarlo per testarlo. Tuttavia, tutto ciò avviene nel metodo @Before sembra essere il rollback dopo ogni prova, anche se io annotare il metodo con @Rollback(false)@Rollback (false) non funziona su @Prima di utilizzare SpringJUnit4ClassRunner

Ecco una versione semplificata di quello che sto cercando di fare:

public class TestClass 
{ 
    @Autowired 
    MyService service; 

    @Before 
    public void setup() 
    { 
     if(service.getById(1) == null) 
     { 
     Thing thing = new Thing(); 
     thing.setId(1); 
     service.create(new Thing(1)) 
     } 
    } 
} 

Ho anche provato a utilizzare @BeforeClass, ma questo richiede che il metodo sia statico e viene eseguito prima che vengano chiamati tutti i metodi di settaggio @Autowired, quindi non riesco ad accedere ai servizi che devo chiamare quando viene eseguito il numero di serie @BeforeClass.

Ho provato a utilizzare @PostConstruct, ma ci sono problemi con l'avere una transazione disponibile (e la mia configurazione è tale che una sessione di Hibernate è disponibile solo all'avvio di una transazione). Stranamente sembrava che una sessione fosse disponibile, ma due oggetti ricavati dalla stessa sessione non erano uguali, il che significava che la cache di primo livello di Hibernate sembrava fallire, o che ogni operazione avveniva in una sessione separata. @BeforeTransaction sembra mostrare lo stesso comportamento.

+0

Dove hai inserito l'annotazione '@ Rollback', a livello di classe o di metodo? – Ralph

+0

@Ralph Ho provato entrambi sul metodo 'setup()' '@Rollback (false)', e poi anche sulla classe, annotando anche i metodi di test con '@ Rollback'. –

+0

Hai mai trovato un modo per raggiungere questo obiettivo? – Arjan

risposta

2

La primavera TransactionalTestExecutionListener è responsabile della gestione della transazione per i test di Junit. Utilizza due metodi (beforeTestMethod e afterTestMethod) per avviare e terminare la transazione per ciascuno dei test di Junit.

Per quanto riguarda l'annotazione @Before sembra funzionare in questo modo, si applica la @Rollback attributo specificato sul metodo di prova al di metodo di configurazione con @Before annotazione

ho questo esempio per spiegare il processo , Ho due metodi di test uno con (rollback false l'altro con rollback true)

 @RunWith(SpringJUnit4ClassRunner.class) 
     @ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={SpringConfig.class}) 
     @Transactional 
     public class MyTest 
     { 

     @Before 
     public void setUp() 
     { 
      //When executing this method setUp 
      //The transaction will be rolled back after rollBackTrue Test 
      //The transaction will not be rolled back after rollBackFalse Test 
     } 


     @Test 
     @Rollback(true) 
     public void rollBackTrue() 
     { 
      Assert.assertTrue(true); 
     } 

     @Test 
     @Rollback(false) 
     public void rollBackFalse() 
     { 
      Assert.assertTrue(true); 
     } 
    } 
+0

Ciao Prasana. Grazie per la tua risposta, ma non può essere corretta. Se service.create() non faceva parte di una transazione, perché viene eseguito il rollback di default dopo ogni test? Il problema è * voglio * essere al di fuori di una transazione in modo che non venga ripristinato, ma non riesca a scoprire come. –

+0

Spiacente, il mio test mi ha buttato via e inoltre avrei dovuto leggere la documentazione del metodo, ho cambiato la risposta con un esempio. –

Problemi correlati