2014-11-25 11 views
9

próbuję łączyć adnotacje następująco:Jak wykonać @Sql przed metody @Before

org.springframework.test.context.jdbc.Sql i org.junit.Before

Podobnie jak kod obserwacji:

@Test 
@Sql(scripts = "dml-parametro.sql") 
public void testData(){ 
    Iterable<Parametro> parametros = parametroService.findAll(); 
    List<Parametro> parametrosList = Lists.newArrayList(parametros); 

    Assert.assertThat(parametrosList.size(), Is.is(1)); 
} 

@Before 
public void beforeMethod() { 
    JdbcTestUtils.deleteFromTables(jdbcTemplate, "PARAMETRO"); 
} 

Kod w metodzie @Before jest uruchomiony po wtedy skrypt „DML-parametro.sql” w adnotacji @Sql.

Czy to słuszne?

Dla rozwiązania tego używam @After w miejscu niż @ Begore, ale chciałbym cdelete tabele przed wykonaniem testu, nie po.

Nie chciałbym używać @SqlConfig. Nie używam zasięgu transacional na poziomie testowym, więc muszę wyczyścić moje tabele w każdej metodzie testu. Jeśli każda metoda testowa wymaga czyszczenia tabel, chciałbym to zrobić w metodzie @Before. Nie chciałbym tego robić w każdej metodzie testu z @SqlConfig. Myślę, że zachowanie @Sql do wykonania przed @ Before jest złe.

Odpowiedz

31

Domyślnie wszystkie skrypty SQL wykonywane przez @Sql zostaną wykonane przed dowolnymi metodami @Before. Tak więc zachowanie, którego doświadczasz jest poprawne, ale możesz zmienić fazę wykonania za pomocą atrybutu executionPhase w @Sql (patrz przykład poniżej).

Jeśli chcesz wykonać wiele skryptów, jest to również możliwe przez @Sql.

Więc jeśli masz czyste-up skrypt o nazwie clean-parametro.sql, który usuwa z tabeli PARAMETRO, można opisywać metodę testową jak następuje (zamiast wywoływać JdbcTestUtils.deleteFromTables() w swojej metodzie @Before).

@Test 
@Sql({"dml-parametro.sql", "clean-parametro.sql"}) 
public void test() { /* ... */ } 

Oczywiście, jeśli dml-parametro.sql wstawia wartości do tabeli PARAMETRO, to prawdopodobnie nie ma sensu, aby natychmiast usunąć te wartości w czystej-up skryptu.

Należy pamiętać, że @Sql i @SqlConfig udostępniają wiele poziomów konfiguracji do wykonywania skryptów.

Na przykład, jeśli chcesz utworzyć tabele przed testem i posprzątać po teście, można zrobić coś takiego na Java 8:

@Test 
@Sql("create-tables.sql") 
@Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD) 
public void test() { /* ... */ } 

Albo użyć @SqlGroup jako pojemnik na Java 6 lub Java 7:

@Test 
@SqlGroup({ 
    @Sql("create-tables.sql"), 
    @Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD) 
}) 
public void test() { /* ... */ } 

Jeśli testy są @Transactional i chcesz, aby oczyścić popełnił stan bazy danych, można polecić Wiosna wykonać swoją oczyszczenia skrypt SQL w nowej transakcji tak:

@Test 
@Sql("insert-test-data.sql") 
@Sql(
    scripts = "clean-up.sql", 
    executionPhase = AFTER_TEST_METHOD, 
    config = @SqlConfig(transactionMode = ISOLATED) 
) 
public void test() { /* ... */ } 

Mam nadzieję, że to wyjaśni wam wszystko!

Cheers,

Sam (autor Spring Framework TestContext)


Uwagi:

  • AFTER_TEST_METHOD statycznie importowane z ExecutionPhase
  • ISOLATED statycznie importowane z TransactionMode
+0

Mam klasę abstrakcyjną opatrzoną adnotacją '@ Sql', która uruchamia niektóre skrypty i jej podklasę, która również jest opatrzona adnotacją' @ Sql'. kiedy uruchomiłem wiosenny boot 1.2 wszystko działało zgodnie z oczekiwaniami -> skrypty klasy abstrakcyjnej były uruchamiane przed sciptami klasy potomnej. ale po uaktualnieniu do wersji rozruchowej 1.3, klasa potomna '@ Sql' zaczęła nadpisywać' @ Sql' klasy abstrakcyjnej klasy nadrzędnej i tym samym skrypty klasy nadrzędnej nigdy się nie uruchamiają. Nie wiem, co teraz zrobić:/ –

+0

Stworzyłem pytanie do tego, znalezione tutaj: http://stackoverflow.com/questions/39296329/sub-classing-sql-annotated-class –

Powiązane problemy