我在测试类上使用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
我想现在一切都好,但是有没有办法将这些注释结合起来,所以我可以使用一个注释?
答案 0 :(得分:8)
元注释不是代码重用的唯一方式。我们改用继承:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Config.class)
@IntegrationTest
@Sql({"classpath:rollback.sql", "classpath:create-tables.sql"})
@Transactional
public abstract class IntegrationTest {
}
public class FooTest extends IntegrationTest {
}
public class BarTest extends IntegrationTest {
}
与元注释不同,Spring和JUnit都能理解基类的注释继承。
答案 1 :(得分:1)
好的,我在JUnit GitHub上发现了一些关于此问题的旧讨论:
在可读性和干燥性之间进行某种权衡。
允许一些元注释也会减慢像IDE这样的工具。
我似乎不会在短期内实施,所以现在我必须保留两个注释。