使用组件类进行上下文配置

要使用组件类(请参阅 基于 Java 的容器配置)为测试加载 ApplicationContext,可以使用 @ContextConfiguration 标注测试类,并使用包含对组件类的引用的数组配置 classes 属性。以下示例显示了如何执行此操作:

@ExtendWith(InfraExtension.class)
// ApplicationContext 将从 AppConfig 和 TestConfig 加载
@ContextConfiguration(classes = {AppConfig.class, TestConfig.class}) (1)
class MyTest {
  // 类主体...
}
1 指定组件类。
组件类

术语 “组件类” 可以指以下任何一种:

  • 标注了 @Configuration 的类。

  • 组件(即标注了 @Component@Service@Repository 或其他构造型注解的类)。

  • 标注了 jakarta.inject 注解的符合 JSR-330 标准的类。

  • 任何包含 @Bean 方法的类。

  • 任何其他旨在注册为 Infra 组件的类(即 ApplicationContext 中的 Infra bean),可能利用单个构造函数的自动装配,而不使用 Infra 注解。

有关组件类的配置和语义的更多信息,请参阅 @Configuration@Bean 的 javadoc,特别注意关于 @Bean Lite 模式的讨论。

如果你从 @ContextConfiguration 注解中省略 classes 属性,TestContext 框架会尝试检测默认配置类的存在。具体来说,AnnotationConfigContextLoaderAnnotationConfigWebContextLoader 会检测测试类的所有 static 嵌套类,这些类满足配置类实现的要求,如 @Configuration javadoc 中所述。请注意,配置类的名称是任意的。此外,如果需要,测试类可以包含多个 static 嵌套配置类。在以下示例中,OrderServiceTest 类声明了一个名为 Configstatic 嵌套配置类,该类会自动用于加载测试类的 ApplicationContext

@JUnitConfig (1)
// ApplicationContext 将从静态嵌套类 Config 加载
class OrderServiceTest {

  @Configuration
  static class Config {

    // 这个 bean 将被注入到 OrderServiceTest 类中
    @Bean
    OrderService orderService() {
      OrderService orderService = new OrderServiceImpl();
      // 设置属性等
      return orderService;
    }
  }

  @Autowired
  OrderService orderService;

  @Test
  void testOrderService() {
    // 测试 orderService
  }

}
1 从嵌套的 Config 类加载配置信息。