Как я могу сделать Spring TestContext Framework использовать несколько источников данных?

StackOverflow https://stackoverflow.com/questions/3968629

Вопрос

Я пытаюсь интегрировать тест моего приложения с весной TestContext Framework. Я сделал это, продлевая AbstractTransactionalJUnit4SpringContextTests, как обычно. Тем не менее, мое приложение имеет три разных источника данных (с именами, такими как xdataSource, ydataSource, zdataSource), Så, когда я пытаюсь запустить тест, автоматический источник данных в AbstractTransactionalJUnit4SpringContextTests Не будет работать, так как он ищет источник данных с помощью Autwire-By-Type, но находит три, поэтому он не знает, какой из них выбрать.

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

Это было полезно?

Решение

Хорошо, я разобрался. Ответ на этот вопрос в два раза. Во-первых, продление 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.

Другие советы

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

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

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

Я нашел эти детали в весеннем билете Джира # SPR-4634.

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

Если вам нужно все THEMEEM, то вы не можете полагаться на автосистему - использовать ReflectionTestUtils Чтобы установить его вручную в ваши тесты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top