Как объединить много аннотаций Spring test в одну аннотацию?

я использую удобные аннотации Spring Boot для своих тестовых классов для интеграционных тестов.

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

я нашел довольно уродливым копировать / вставлять весь этот блок в каждом тестовом классе, поэтому я создал свой собственный @MyIntegrationTest аннотации

@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 {
}

однако, если я добавить @RunWith(SpringJUnit4ClassRunner.class) в моей новой аннотации JUnit будет работать со своим бегуном по умолчанию , что нежелательно. Поэтому сейчас я должен использовать две аннотации.

@RunWith(SpringJUnit4ClassRunner.class)
@MyIntegrationTest

Я думаю, что сейчас это нормально, но есть ли способ объединить эти аннотации, чтобы я мог использовать одну аннотацию?

2 ответов


мета-аннотации-не единственный способ повторного использования кода. Вместо этого мы используем наследование:

@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 {

}

В отличие от мета-аннотаций, наследование аннотаций от базовых классов понимается как Spring, так и JUnit.


хорошо, поэтому я нашел несколько старых дискуссий об этом на JUnit GitHub:

Это своего рода компромисс между удобочитаемостью и сухостью.

разрешение некоторых мета-аннотаций также может замедлить работу таких инструментов, как IDEs.

Я не кажется, что это на пути к реализации любого время скоро, так что пока мне придется сохранить мои две аннотации.