仅使用一个 Bean 的 Spring 上下文测试

Dav*_*vid 9 spring-test spring-boot spring-boot-test

运行 spring boot 测试的推荐方法是什么,其中仅在上下文中配置了一个被测主题。

如果我用

@RunWith(SpringRunner.class)
@SpringBootTest(properties = "spring.profiles.active=test")
@ContextConfiguration(classes = MyTestBean.class)
Run Code Online (Sandbox Code Playgroud)

然后它似乎工作 - 测试通过,上下文快速启动并且似乎只包含我想要的 bean。但是,这似乎是对@ContextConfiguration(classes = MyTestBean.class)注释的错误使用。如果我理解正确,我引用的类应该是一个Configuration类,而不是一个常规的 spring 服务 bean 或组件。

那正确吗?或者这确实是实现这一目标的有效方法?我知道有更复杂的例子一样org.springframework.boot.test.autoconfigure.json.JsonTest,其使用@TypeExcludeFilters(JsonExcludeFilter.class)控制方面-但这似乎矫枉过正我的使用情况。我只想要我的一个 bean 的上下文。

澄清

我知道我可以在没有 spring 上下文测试的情况下将我正在测试的一个 bean 构建为 POJO,并删除上面的三个注释。但在我的精确用例中,我实际上依赖于通过设置中的设置应用于上下文的一些配置application-test.properties文件 - 这就是为什么我使用配置文件集将其作为 Spring Boot 测试的原因。从我的角度来看,这不是孤立于 spring 上下文配置的单个类的简单单元测试 - 该测试依赖于正在应用的某些配置(当前由 spring boot 应用程序属性提供)。我确实可以通过在 spring 上下文之外创建一个新实例来将组件作为 POJO 进行测试,我使用构造函数注入使提供必要的依赖项变得简单,但测试确实依赖于诸如日志级别之类的东西(测试实际上使正在生成的某些日志上的断言),这需要正确设置日志级别(目前正在通过logging.level.com.example=DEBUG设置 spring 上下文的属性文件完成)。

Sam*_*nen 7

对于初学者,首先阅读文档(例如,此答案中下面链接的 JavaDoc)是推荐的最佳实践,因为它已经回答了您的问题。

如果我理解正确,我引用的类应该是一个Configuration类,而不是一个常规的 spring 服务 bean 或组件。

那正确吗?

不,这并不完全正确。

提供给@ContextConfiguration的类通常是 @Configuration类,但这不是必需的。

以下是JavaDoc@ContextConfiguration的摘录:

带注释的类

术语带注释的类可以指以下任何一个。

  • 带有注释的类 @Configuration
  • A组分(即,一类注解为@Component@Service@Repository等等)
  • 使用注解进行javax.inject注解的符合 JSR-330 的类
  • 包含@Bean-methods 的任何其他类

因此,您可以将任何“带注释的类”传递给@ContextConfiguration.

或者这确实是实现这一目标的有效方法?

实际上,这是实现该目标的有效方法;但是,加载ApplicationContext包含单个用户 bean 的 Bean也有点不寻常。

问候,

Sam(Spring TestContext Framework 的作者