如何使用现有应用程序的spring配置类只测试一个bean?

时间:2014-09-02 21:06:57

标签: java spring spring-4

在我的代码中,我不想加载XXApplicationConfig类中定义的所有bean。

XXApplicationConfig是一个@Configuration带注释的文件,它定义了一堆spring bean。

所以,我想在测试时只从XXApplicationConfig类加载AppBean,以减少加载测试时间,并区分我正在测试的内容。我还想使用XXApplicationConfig类加载该类,以确保定义的bean配置也是正确的。

这是我测试AppBean类的Test类(已修改)。

您是否可以告诉我这是否是正确的做法并建议如何让它变得更好?目前,这种方法似乎有效。但是,不确定它是否是接近它的正确方法。

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

    @Configuration
    @PropertySources(value = {@PropertySource("classpath:test.properties")})
    static class MyTestConfiguration {

        @Bean
        public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceHolderConfigurer()  {
            return new PropertySourcesPlaceholderConfigurer();
        }

        @Bean
        public XXApplicationConfig xxAppConfig() {
            return new XXApplicationConfig();
        }

        @Bean
        public CustomTestService customTestService() {
            return new CustomTestService();
        }

        @Bean
        public AppBean appBean() throws Exception {
            return XXApplicationConfig().appBean();
        }

    }

    @Autowired
    private AppBean appBean;


    @Test
    public void testAppBean() {
        test appBean.doSomething();
    }
}

2 个答案:

答案 0 :(得分:0)

如果只想测试一个对象,只需使用该类的构造函数创建该类的一个对象。 Spring bean被设计为POJO。 Spring上下文只是创建和连接对象的便捷方式。没有什么可以阻止你自己创建和连接它们。

答案 1 :(得分:0)

如果您可以实例化要测试的类并通过构造函数和/或setter getter手动注入所需的所有依赖项,那么您就不需要在测试中使用Spring。

但是,如果你的bean:

  1. 使用标有@Autowired@Value的私有字段,但没有相应的getter / setter。
  2. 取决于许多其他豆类。
  3. 您要测试的行为取决于Spring AOP / Proxies(例如,您使用@Transactional@Cacheable)。
  4. 然后你需要Spring连接bean。我个人更喜欢为这些案例定义一个最小@Configuration类。

    然后,如果您的bean符合列表中的条件,您应该考虑重构bean以最小化其依赖性并促进测试。