如何在单个注释中组合许多Spring测试注释?

问题描述 投票:9回答:2

我在测试类上使用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

我想现在好了,但是有没有办法结合这些注释,所以我可以使用单个注释?

java junit annotations spring-boot
2个回答
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
投票

好的,我在JUnit GitHub上找到了一些关于这个的旧讨论:

这是可读性和干燥性之间的某种权衡。

允许一些元注释也可能会减慢像IDE这样的工具。

我似乎不会在短期内实施它,所以现在我将不得不保留我的两个注释。

© www.soinside.com 2019 - 2024. All rights reserved.