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

时间:2017-06-05 07:46:23

标签: spring unit-testing spring-boot

我能够使用SpringBoot 1.5.3

设置并成功运行三种不同的测试配置

方法#1。使用 $("#model-pricing-row").clone().attr("id", "pricing-row-" + i).appendTo("#pricing-table"); $("#pricing-row-" + i + " #model-effectiveDate").attr("id", "effectiveDate-" + i); $("#effectiveDate-" + i).attr("name", "Project.ProjectPricings[" + i + "].UnitTypePriceEffDate"); $("#effectiveDate-" + i).val(selectedUnitTypePriceEffDate[i]); 注释导入Bean

@Import

方法#2。使用@RunWith(SpringJUnit4ClassRunner.class) @Import({MyBean.class}) public class MyBeanTest() { @Autowired private MyBean myBean; } 注释导入Bean

@ContextConfiguration

方法#3(内部类配置;基于the official blog post

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

考虑@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; } 注释文档

  

表示一个或多个{@link Configuration @Configuration}类   导入。

并且@Import不是配置类,而是使用MyBean注释注释的bean类,它看起来像方法#1是不正确的。

来自@Component文档

  

{@ code @ContextConfiguration}定义了类级元数据   用于确定如何加载和配置{@link   org.springframework.context.ApplicationContext ApplicationContext}   用于集成测试。

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

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

我是对的吗?是否有其他标准为什么我应该使用方法#3,如性能或其他什么?

2 个答案:

答案 0 :(得分:2)

如果你选择#3,你实际上不需要指定加载器。 From the doc 除了doc中的示例,您还可以覆盖env。如果您需要在环境中注入属性而不使用真实属性,则使用@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
    }

}

答案 1 :(得分:0)

这实际上取决于您使用的是Spring Boot提供的测试注释之一,还是从头开始构建上下文。 Spring Framework的核心支持要求您通过@ContextConfiguration提供“根配置”。如果您使用的是Spring Boot,则它具有own way of detecting the root context to use。默认情况下,它找到的第一个@SpringBootConfiguration注释类型。在典型的应用程序结构中,您的@SpringBootApplication位于应用程序包的根目录。

请记住,在该设置中使用@ContextConfiguration并不是一个好主意,因为它会禁用该查找,并且会比“导入bean”做更多的事情。

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

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

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

因此,方法1绝对正确。

如果该组件在测试中是本地的,而您不需要与其他测试共享,则可以使用内部@TestConfiguration。这是also documented in the reference guide