Как я могу заставить Spring testcontext framework использовать несколько источников данных? - PullRequest
2 голосов
/ 19 октября 2010

Я пытаюсь провести интеграционное тестирование моего приложения с платформой Spring TestContext. Я сделал это, расширив AbstractTransactionalJUnit4SpringContextTests, как обычно. Однако у моего приложения есть три разных источника данных (с именами, такими как xDataSource, yDataSource, zdataSource), поэтому при попытке запустить тест автоматическое подключение источника данных в AbstractTransactionalJUnit4SpringContextTests не будет работать, так как оно ищет источник данных с помощью autowire-by-type, но находит три, поэтому он не знает, какой выбрать.

Есть ли способ заставить Spring TestContext Framework использовать три источника данных? Если так; как?

Ответы [ 3 ]

2 голосов
/ 19 октября 2010

ОК, я понял это.Ответ на этот вопрос двоякий.Во-первых, расширение AbstractTransactionalJUnit4SpringContextTests не будет работать.Это связано с тем, что для создания SimpleJdbcTemplate для проверки данных с помощью простых запросов JDBC в тесте необходим единый источник данных.Поскольку я не использую эту функцию в этом тесте, я мог бы заменить extends AbstractTransactionalJUnit4SpringContextTests на следующую конфигурацию:

@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class,
    TransactionalTestExecutionListener.class
})
@Transactional
public class IntegrationTest {
  ...
}

Комбинация этих аннотаций дает те же настройки, что и расширение AbstractTransactionalJUnit4SpringContextTests.

Во второй части было понимание того, что, поскольку у меня есть три источника данных, мне также нужны все три, поэтому на них должна ссылаться одна и та же PlatformTransactionManager.Я распределил транзакции.Это невозможно с DataSourceTransactionManager, поэтому мне пришлось использовать JtaTransactionManager.

1 голос
/ 17 февраля 2014

Класс AbstractTransactionalJUnit4SpringContextTests автоматически подключается к одному источнику данных только для удобства предоставления внедренного объекта JdbcTemplate.Вы можете переопределить метод setDataSource(DataSource dataSource) из AbstractTransactionalJUnit4SpringContextTests в своем тестовом подклассе и указать источник данных для использования следующим образом:

@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) { 
  this.jdbcTemplate = new JdbcTemplate(dataSource); 
} 

Вам просто нужно указать имя одного источника данных, который должен использовать Springдля jdbcTemplate удобных методов.Если расширение AbstractTransactionalJUnit4SpringContextTests более удобно, чем другие методы, упомянутые выше, вы можете заставить его работать, просто выбрав один из ваших источников данных.

Я нашел эти детали в билете Spring Jira # SPR-4634 .

0 голосов
/ 19 октября 2010

Вы можете определить один из источников данных как primary="true" в вашем xml, и он будет выбран.

Если вам нужны все три, тогда вы не можете полагаться на автопроводку - используйте ReflectionTestUtils, чтобы установить его вручную в своих тестах.

...