2015-06-28 21 views
6

Korzystam z wygodnych adnotacji Spring Boot na moich testowych klasach, do testów integracyjnych.Jak połączyć wiele adnotacji testowych wiosennych w jednej adnotacji?

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Config.class) 
@IntegrationTest 
@Sql({"classpath:rollback.sql", "classpath:create-tables.sql"}) 
@Transactional 

Znalazłem to dość brzydki skopiować/wkleić ten cały blok na każdej klasy testowej, więc stworzyliśmy własne @MyIntegrationTest adnotacji

@SpringApplicationConfiguration(classes = Config.class) 
@IntegrationTest 
@Sql({"classpath:database-scripts/rollback.sql", "classpath:database-scripts/create-tables.sql", "classpath:database-scripts/insert-test-data.sql"}) 
@Transactional 
@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(value = RetentionPolicy.RUNTIME) 
@interface MyIntegrationTest { 
} 

Jednak jeśli dodać @RunWith(SpringJUnit4ClassRunner.class) w moim nowym adnotacji , wtedy JUnit będzie działał z domyślnym runnerem - co nie jest pożądane. Więc na razie muszę użyć dwóch adnotacji.

@RunWith(SpringJUnit4ClassRunner.class) 
@MyIntegrationTest 

Myślę, że to jest w porządku teraz, ale czy jest jakiś sposób, aby połączyć te adnotacje, więc będę mógł użyć pojedynczego adnotacji?

+1

Sądzę, że to najlepsze, co można uzyskać ... http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#integration- testing-annotations- meta – sodik

+0

Ok Wkopiłem trochę w kod JUnit. Klasa 'AnnotatedBuilder' jest próbą wykrycia dowolnego Runnera za pomocą adnotacji i używają one:' RunWith adnotation = currentTestClass.getAnnotation (RunWith.class); ', więc nie będzie pobierał żadnej" adnotacji na adnotacji ". Nie wiem, dlaczego nie zostało to zaimplementowane, poprosi chłopaków o ich GitHub. – Guillaume

Odpowiedz

4

Meta-adnotacje to nie jedyny sposób ponownego użycia kodu. Używamy dziedziczenie Zamiast:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Config.class) 
@IntegrationTest 
@Sql({"classpath:rollback.sql", "classpath:create-tables.sql"}) 
@Transactional 
abstract class IntegrationTest { 
} 

class FooTest extends IntegrationTest { 

} 

class BarTest extends IntegrationTest { 

} 

przeciwieństwie meta adnotacji adnotacji dziedziczenie z klas bazowych jest rozumiane zarówno przez wiosnę i JUnit.

+0

To dla mnie właściwa odpowiedź, nawet jeśli mam nadzieję, że posiadam coś innego niż dziedziczenie. Gdy baza kodów powiększa dziedziczenie zawsze powoduje pewne problemy z łączeniem i dość trudno jest pozbyć się później klasy abstrakcyjnej, ale myślę, że to najlepsza rzecz, jaką mogę teraz uzyskać. – Guillaume

0

Ok więc znalazłem stare dyskusje na ten temat na JUnit GitHub:

Jest jakiś kompromis pomiędzy czytelność i sucho ness.

Zezwanie niektórych meta-adnotacji może również spowolnić działanie narzędzi takich jak IDE.

Nie wydaje mi się, że jest na dobrej drodze do wdrożenia w najbliższym czasie, więc na razie będę musiał zachować dwie moje adnotacje.

Powiązane problemy