当前位置: 首页 > 知识库问答 >
问题:

@导入vs@ContextConfiguration用于在单元测试中导入bean

张建华
2023-03-14

我能够使用SpringBoot 1.5设置并成功运行三种不同的测试配置。3.

方法#1。使用注释导入Bean

@RunWith(SpringJUnit4ClassRunner.class)
@Import({MyBean.class})
public class MyBeanTest() {
    @Autowired
    private MyBean myBean;
}

方法#2。使用@ContextConfiguration注释导入Bean

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyBean.class})
public class MyBeanTest() {
    @Autowired
    private MyBean myBean;
}

方法#3(带内部类配置;基于官方博文)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class)
public class MyBeanTest() {

    @Configuration
    static class ContextConfiguration {
        @Bean
        public MyBean myBean() {
            return new MyBean();
        }
    }

    @Autowired
    private MyBean myBean;

}

考虑到@Import注释文档

指示要导入的一个或多个{@link Configuration@Configuration}类。

事实上,MyBean不是一个配置类,而是一个用@Component注释注释的bean类,它看起来像方法1,这是不正确的。

@ContextConfiguration留档

{@code@ContextConfiguration}定义用于确定如何加载和配置集成测试的{@linkorg.springframework.context.Application ationContext Application ationContext}的类级元数据。

听起来它更适用于单元测试,但仍然应该加载一种配置。

方法#1和#2更短更简单。方法#3看起来是正确的方法。

我说得对吗?我应该使用方法#3还有其他标准吗,比如性能或其他什么?

共有2个答案

吕琪
2023-03-14

这实际上取决于您使用的是Spring Boot提供的测试注释之一,还是从头开始构建上下文。Spring框架中的核心支持要求您通过@ContextConfiguration提供“根配置”。如果您使用的是SpringBoot,它有自己的方法来检测要使用的根上下文。默认情况下,它找到的第一个@SpringBootConfiguration-注释类型。在典型的应用程序结构中,这是位于应用程序包根目录下的@springbootplication

考虑到这一点,在设置中使用@ContextConfiguration不是一个好主意,因为它会禁用查找,并且不仅仅是“导入bean”。

假设已经为您创建了上下文,并且您希望添加其他bean,那么有两种主要方法:

如果您需要有选择地导入组件(除了检测要使用的正确上下文的默认行为之外),那么@import绝对可以。与此同时,@Import的Javadoc经过了润色,提到导入组件是绝对好的,它不是特定于@Configuration类的:

指示要导入的一个或多个组件类-通常为@Configuration类。

所以,方法#1绝对是正确的。

如果组件是测试的本地组件,并且您不需要与其他测试共享它,那么可以使用内部@TestConfiguration。参考指南中也记录了这一点。

锺离浩慨
2023-03-14

如果使用选项3,实际上不需要指定加载器。从文档中,除了文档中的示例之外,您还可以覆盖环境。如果需要在环境中注入属性而不使用真实属性,请使用@TestPropertySource。

@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from the
// static nested Config class
@ContextConfiguration
@TestPropertySource(properties = { "timezone = GMT", "port: 4242" })
public class OrderServiceTest {

    @Configuration
    static class Config {

        // this bean will be injected into the OrderServiceTest class
        @Bean
        public OrderService orderService() {
            OrderService orderService = new OrderServiceImpl();
            // set properties, etc.
            return orderService;
        }
    }

    @Autowired
    private OrderService orderService;

    @Test
    public void testOrderService() {
        // test the orderService
    }

}
 类似资料:
  • 语境 在一个使用karma和jasmine进行单元测试的Angular5项目中,我使用karma-sonarqube-unit-reporter为我的单元测试生成这个报告文件。 但是当我将它导入到Sonarqube(V6.7)(通过Jenkins)中时,我会得到以下结果 (此属性重要吗?)

  • 我最近注意到,似乎不适用于监视扩展模块。 以下是我迄今为止尝试过的: 使用WatchKit应用程序创建一个新的Xcode项目,并包含单元测试 打开自动创建的单元测试文件并添加(确认这是扩展的构建设置中正确的模块名称后)。这会导致“无此类模块”编译器错误 确认在扩展生成设置中将“启用可测试性”设置为“是” 更改扩展模块的名称以删除空格 通过向测试目标添加所需的文件,我当然能够成功地进行单元测试,但我

  • 我需要帮助来找出如何解决活动中两个相互冲突的导入的问题,即: null 取决于哪一个先来。

  • NEI 平台目前支持 NEI 自定义的开放标准来批量导入测试用例。 导入的入口 你可以在接口测试中左侧的接口列表树的接口列表一栏导入测试用例,也可以点开单独一项待测试的接口,在用例管理里,点选导入测试用例导入。 注意:两种导入方式有一点小小的区别,第一种导入测试用例可以导入当前项目任意接口的任意测试用例,而第二种只能导入当前标签页所示接口(见第二张图左上角的PAT User-修改)的测试用例。 导

  • “导入向导”让你从 CSV、TXT、XML、DBF 等格式导入数据到表或集合。你可以将设置保存为一个配置文件以供将来使用或用作设置自动运行任务。若要打开导入向导窗口,请在对象工具栏点击 “导入向导”。 【注意】Navicat Essentials 版只支持导入纯文本格式的文件,例如 TXT、CSV、XML 和 JSON。 【提示】你可以拖拉一个支持格式的文件到表或集合的对象选项卡,或到导航窗格中的

  • “导入向导”让你从 CSV、TXT、XML、DBF 等格式导入数据到表或集合。你可以将设置保存为一个配置文件以供将来使用或用作设置自动运行任务。若要打开导入向导窗口,请在对象工具栏点击 。 【注意】Navicat Essentials 版只支持导入纯文本格式的文件,例如 TXT、CSV、XML 和 JSON。 【提示】你可以拖拉一个支持格式的文件到表或集合的对象选项卡,或到导航窗格中的一个数据库或