我是不是需要使用 Kotlin Junit5 和 Spring Boot 将 Spring 注释复制到内部类?

Posted

技术标签:

【中文标题】我是不是需要使用 Kotlin Junit5 和 Spring Boot 将 Spring 注释复制到内部类?【英文标题】:Should I need to copy Spring annotations to inner classes with Kotlin Junit5 and Spring Boot?我是否需要使用 Kotlin Junit5 和 Spring Boot 将 Spring 注释复制到内部类? 【发布时间】:2020-02-01 00:03:15 【问题描述】:

我在 JUnit5 中使用 @Nested 对测试进行主题分组。遵循已发布的示例和我之前在 Java 和 Kotlin 中使用过的模式。然而,与外部测试类关联的 Spring 注释并没有像我期望的那样应用于内部类。这是一个错误还是我的错误假设?

我正在使用 @SpringBootTest 和 @AutoConfigureMocMvc 注释在 Spring 中测试 RESTful 端点。我想将它们分组为身份验证、获取、发布、放置等。根据过去的经验和示例,我使用@Nested 和内部类对它们进行分组。但是,我发现除非我将所有注释从外部测试类复制到每个内部类声明,否则没有任何效果。我不相信 Java 中就是这种情况,也没有在示例中暗示。

失败:

@SpringBootTest
@AutoConfigureMockMvc
class EndpointTest 
  // ... @Autowire's, mocks etc...

  @Nested
  inner class AuthTest 
    @Test
    fun `should fail with bad auth`() 
      // some logic
    
  

成功:

@SpringBootTest
@AutoConfigureMockMvc
class EndpointTest 
  // ... @Autowire's, mocks etc...
  @SpringBootTest
  @AutoConfigureMockMvc
  @Nested
  inner class AuthTest 
    @Test
    fun `should fail with bad auth`() 
      // some logic
    
  

我会假设并且示例似乎支持内部类不应该需要复制所有注释。我认为在 Java 中不会。这是关于 Kotlin 的 Springs 注释代码吗?

【问题讨论】:

Transaction roll back is not working in test case in @Nested class of JUnit5的可能重复 【参考方案1】:

这是意料之中的,因为 Spring Framework 尚不支持来自封闭类的注解的“伪继承”(Java 和 Kotlin 均不支持)。

详情见以下回答:https://***.com/a/44227179/388980

【讨论】:

以上是关于我是不是需要使用 Kotlin Junit5 和 Spring Boot 将 Spring 注释复制到内部类?的主要内容,如果未能解决你的问题,请参考以下文章

在 Kotlin 和 JUnit5 中测试 Spring Boot 缓存

如何使用 JUnit 5 在 Kotlin 中创建 TestContainers 基测试类

Gradle 没有找到我使用 Kotlin 和 JUnit 5 进行的测试

如何在用 Kotlin 编写的 JUnit 5 测试类中注入 Spring bean?

使用 spring boot gradle 插件无法使用依赖管理执行 junit5 测试

如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?