使用Spring配置文件将特定bean注入DAO

时间:2017-02-10 14:34:56

标签: spring dependency-injection junit4 spring-profiles springjunit4classrunner

在我的webapplication中,applicationContext中有两个数据源bean,一个用于real-env,另一个用于执行测试。 dataSource对象注入一个DAO类。使用Spring配置文件如何配置测试数据源应该在DAO中注入运行Test(JUnit),并且应该在DAO中注入real-env dataSource,同时将代码部署到real-env?

1 个答案:

答案 0 :(得分:1)

实际上有两种方法可以实现目标:

  1. 一种方法是使用两个不同的spring配置文件,一个用于测试(JUnit),另一个用于运行时(real-env)。
  2. 用于真正的环境:

    <!-- default-spring-config.xml -->
    <beans>
    
        ...other beans goes here...
    
        <bean id="datasource" class="xx.yy.zz.SomeDataSourceProvider1" />
    
    </beans>
    

    用于测试:

    <!-- test-spring-config.xml -->
    <beans>
    
        ...other beans goes here...
    
        <bean id="datasource" class="xx.yy.zz.SomeDataSourceProvider2" />
    
    </beans>
    

    在您的web.xml中指定 default-spring-config.xml 作为spring在运行时使用的 contextConfigLocation

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/default-spring-config.xml</param-value>
    </context-param>
    

    最后在 ContextConfiguration 中为测试指定 test-spring-config.xml

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("/test-spring-config.xml")// it will be loaded from "classpath:/test-spring-config.xml"
    public class YourClassTest {
    
        @Autowired
        private DataSource datasource;
    
        @Test
        public void your_function_test() {
    
            //use datasource here...
    
        }
    }
    
    1. 第二种方法是按照你的建议使用Spring配置文件(即使我更喜欢第一种,因为它更适合这种情况)。
    2. 首先将这些行添加到web.xml中,让Spring知道默认配置文件(real-env):

      <context-param>
          <param-name>spring.profiles.active</param-name>
          <param-value>default</param-value
      </context-param>
      

      现在进入Spring配置文件(一个配置文件)创建两个不同的数据源:

      <beans xmlns="http://www.springframework.org/schema/beans"
          xsi:schemaLocation="...">
      
          ...other beans goes here...
      
          <beans profile="default">
      
              <bean id="defaultDatasource" class="xx.yy.zz.SomeDataSourceProvider1" />
      
          </beans>
      
          <beans profile="test" >
      
              <bean id="testDatasource" class="xx.yy.zz.SomeDataSourceProvider2" />
      
          </beans>
      
      </beans>
      

      然后使用 ActiveProfiles

      将DataSource注入您的测试类
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration
      @ActiveProfiles("test")
      public class YourClassTest {
      
          @Autowired
          private DataSource datasource;
      
          @Test
          public void your_function_test() {
      
              //use datasource here...
      
          }
      }
      

      来源:https://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles