【发布时间】:2019-08-11 09:12:22
【问题描述】:
参加任何带有单元测试和集成测试的 Spring Boot 项目。我想单独运行单元测试,而不会失去一次运行所有测试的能力。这个问题的解决方案:
- 默认从 IntelliJ 运行单元测试和集成测试,
- 支持从 cli 运行单元测试和集成测试的 Gradle 命令,并且
- 支持仅从 cli 运行单元测试的 Gradle 命令。完全忽略集成测试类很重要,因为它们包含构建环境中不可用的外部依赖项。
我的做法是在命令行通过测试配置文件:gradlew test -PtestProfile=unit
接下来,在build.gradle 中,设置活动弹簧配置文件:
test {
if (project.hasProperty("testProfile")) {
systemProperty "spring.profiles.active", project.getProperties()["testProfile"]
}
}
问题:如何注释我的集成测试类,以便每当spring.profiles.active=unit 时,集成测试都会被跳过?
我试过了:
-
@Profile,在测试范围内不起作用, -
@IfProfile,不适用于场景 1,因为它需要传递显式属性。 -
@ActiveProfiles,它不起作用,因为它会覆盖当前活动的配置文件,而不是有条件地禁用测试。
这样做的正确方法是什么?
【问题讨论】:
-
我会根据类的名称过滤测试,或者使用类别/标签:docs.gradle.org/current/userguide/…。
-
@JBNizet 谢谢,我更愿意坚持使用在 Spring Boot (jUnit 4) 中本机工作的解决方案,所以
@Tag不可用,但excludeCategories有效! -
这对我来说似乎是一个糟糕的解决方案:您想忽略 Spring 集成测试,但基于需要启动 Spring 上下文以评估配置文件的内容做出决定。是不是很矛盾?
-
@JBNizet 好吧,不完全是。根据应用程序环境启用/禁用某些类是典型的 Spring Boot 模式。如果 jUnit 或 Spring 处理这个而不是 Gradle,那就太好了,因为这将使测试独立于构建工具。
标签: java spring-boot testing gradle