Внедрение определенного компонента в DAO с использованием профиля Spring

В моем веб-приложении есть два компонента источника данных в applicationContext, один из которых должен использоваться для real-env, а другой - для выполнения теста. Объекты dataSource внедряются в один класс DAO. Используя профиль Spring, как я могу настроить тестовый источник данных, который должен быть внедрен в DAO при запуске Test (JUnit), а источник данных real-env должен быть внедрен в DAO, когда код развернут в real-env?

1 ответ

На самом деле есть два способа достижения вашей цели:

  1. Одним из способов является использование двух разных весенних конфигурационных файлов, один для тестов (JUnit), а другой для времени выполнения (real-env).

Быть использованным для реального env:

<!-- 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 в качестве contextConfigLocation, который будет использоваться Spring во время выполнения:

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

И, наконец, укажите test-spring-config.xml в ContextConfiguration для теста:

@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, как вы предлагаете (даже если я предпочитаю первый, потому что он больше подходит для этого случая).

Прежде всего, добавьте эти строки в ваш 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>

Затем добавьте DataSource в свои тестовые классы, используя ActiveProfiles:

@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

Другие вопросы по тегам