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