接口上的@SpringBootTest 注释不起作用
@SpringBootTest annotation on interfrace not working
现在无法在接口上放置注释 SpringBootTest
,继承接口和 运行 测试。
@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
interface SpringBootTestBase
class GreetingControllerITest : SpringBootTestBase {
@Autowired
private lateinit var restTemplate: TestRestTemplate
@Test
fun `spring boot endpoint gets correct greeting`() {
val body = restTemplate.getForObject("/greet/World", String::class.java)
assertThat(body).isEqualTo("Hello, World!")
}
}
失败并出现 NPE
Caused by: java.lang.NullPointerException: null
at org.springframework.boot.test.context.SpringBootTestContextCustomizer.customizeContext(SpringBootTestContextCustomizer.java:50) ~[spring-boot-test-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:326) ~[spring-boot-test-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:625) ~[spring-boot-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:365) ~[spring-boot-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:325) ~[spring-boot-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:138) ~[spring-boot-test-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) ~[spring-test-5.0.1.RELEASE.jar:5.0.1.RELEASE]
... 61 common frames omitted
这个接口的原因是,将所有注释放在接口上,让我们所有的测试都继承那个接口 -> 避免注释代码重复
使用 base-class 而不是接口对我来说不是真正的选择,因为我有其他 base-class 可以继承,它们与测试无关。
这是我应该带给 spring 社区的有用功能吗?
正确:Spring Boot 当前不在接口上搜索与测试相关的注释。
如果觉得有用,请开一个GitHub issue用于Spring启动。
另一方面,如果您的主要目标是避免注释重复,那么这已经得到支持,因为核心 Spring 和 JUnit Jupiter 都支持 组合注释 。
有关组合 Spring、Spring Boot 和 JUnit Jupiter 注释的具体示例,请查看 @SpringEventsWebTest
annotation in my spring-events 示例项目。
此致,
Sam(Spring TestContext Framework 的作者和核心 JUnit 5 提交者)
现在无法在接口上放置注释 SpringBootTest
,继承接口和 运行 测试。
@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
interface SpringBootTestBase
class GreetingControllerITest : SpringBootTestBase {
@Autowired
private lateinit var restTemplate: TestRestTemplate
@Test
fun `spring boot endpoint gets correct greeting`() {
val body = restTemplate.getForObject("/greet/World", String::class.java)
assertThat(body).isEqualTo("Hello, World!")
}
}
失败并出现 NPE
Caused by: java.lang.NullPointerException: null
at org.springframework.boot.test.context.SpringBootTestContextCustomizer.customizeContext(SpringBootTestContextCustomizer.java:50) ~[spring-boot-test-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.test.context.SpringBootContextLoader$ContextCustomizerAdapter.initialize(SpringBootContextLoader.java:326) ~[spring-boot-test-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:625) ~[spring-boot-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:365) ~[spring-boot-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:325) ~[spring-boot-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:138) ~[spring-boot-test-2.0.0.M6.jar:2.0.0.M6]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) ~[spring-test-5.0.1.RELEASE.jar:5.0.1.RELEASE]
... 61 common frames omitted
这个接口的原因是,将所有注释放在接口上,让我们所有的测试都继承那个接口 -> 避免注释代码重复
使用 base-class 而不是接口对我来说不是真正的选择,因为我有其他 base-class 可以继承,它们与测试无关。
这是我应该带给 spring 社区的有用功能吗?
正确:Spring Boot 当前不在接口上搜索与测试相关的注释。
如果觉得有用,请开一个GitHub issue用于Spring启动。
另一方面,如果您的主要目标是避免注释重复,那么这已经得到支持,因为核心 Spring 和 JUnit Jupiter 都支持 组合注释 。
有关组合 Spring、Spring Boot 和 JUnit Jupiter 注释的具体示例,请查看 @SpringEventsWebTest
annotation in my spring-events 示例项目。
此致,
Sam(Spring TestContext Framework 的作者和核心 JUnit 5 提交者)