如何在一个注解中组合多个 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高级话题(组合注解与元注解)