如何在一个注解中组合多个 Spring 测试注解?

Posted

技术标签:

【中文标题】如何在一个注解中组合多个 Spring 测试注解?【英文标题】:How to combine many Spring test annotations in a single annotation? 【发布时间】:2015-09-14 21:08:32 【问题描述】:

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

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

【问题讨论】:

我想这是你能得到的最好的了...docs.spring.io/spring/docs/current/spring-framework-reference/… 好的,我已经深入研究了 JUnit 代码。 AnnotatedBuilder 类是试图通过注释检测任何 Runner 的类,它们使用:RunWith annotation = currentTestClass.getAnnotation(RunWith.class);,因此它不会获取任何“注释上的注释”。不知道为什么它没有实现,会在他们的 GitHub 上询问这些人。 【参考方案1】:

元注释并不是代码重用的唯一方式。我们改用继承:

@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 都可以理解从基类继承的注释。

【讨论】:

这对我来说是一个正确的答案,即使我希望拥有除了继承之外的其他东西。当代码库增长时,继承总是会带来一些耦合问题,以后很难摆脱抽象类,但我想这是我现在能得到的最好的东西。 不幸的是,这对我不起作用。仅将我的 @RunWith(SpringRunner.class) 注释添加到抽象类时,应用程序上下文不再加载。 为了完整起见,这里有一篇反对在测试中使用继承的博文:petrikainulainen.net/programming/unit-testing/… 主要论点是: 1. 继承不是重用代码的正确工具 2. 继承可以有一个对我们的测试套件性能的负面影响 3. 使用继承使测试更难阅读【参考方案2】:

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

https://github.com/junit-team/junit/issues/194 https://github.com/junit-team/junit/issues/202

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

允许一些元注释也可能会减慢 IDE 等工具的速度。

我似乎不会很快实现它,所以现在我必须保留我的两个注释。

【讨论】:

以上是关于如何在一个注解中组合多个 Spring 测试注解?的主要内容,如果未能解决你的问题,请参考以下文章

组合注解与元注解

Spring Boot实战笔记-- Spring高级话题(组合注解与元注解)

Spring 常用注解大全

Spring:如何实现注解的组合

Spring Boot @Condition 注解,组合条件你知道吗

Spring组合注解与元注解