Question

Je suis en train de test d'intégration avec mon application framework Spring TestContext. Je l'ai fait en étendant AbstractTransactionalJUnit4SpringContextTests, comme d'habitude. Cependant, ma demande a trois sources de données différentes (avec des noms tels que xDataSource, yDataSource, zdataSource), cvs lorsque je tente de lancer le test, la autowiring de source de données dans AbstractTransactionalJUnit4SpringContextTests ne fonctionnera pas, car il cherche une source de données avec autowire -Par type, mais trouve trois, il ne sait pas lequel choisir.

Y at-il moyen d'obtenir Spring Framework TestContext à utiliser trois sources de données? Si c'est le cas; comment?

Était-ce utile?

La solution

OK, je compris. La réponse à cette question est double. Tout d'abord, l'extension AbstractTransactionalJUnit4SpringContextTests ne fonctionnera pas. En effet, il a besoin d'une source de données unique pour la création de la SimpleJdbcTemplate pour vérifier des choses avec de simples requêtes JDBC dans le test. Comme je ne l'utilise pas cette fonctionnalité dans ce test, je pourrais remplacer extends AbstractTransactionalJUnit4SpringContextTests avec la configuration collowing:

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

La combinaison de ces annotations donne la même configuration que l'extension AbstractTransactionalJUnit4SpringContextTests.

La seconde partie est de comprendre que depuis que j'ai trois sources de données, je dois aussi trois donc être référencé par le même PlatformTransactionManager. J'ai distribué des transactions. Ceci est impossible avec un DataSourceTransactionManager, donc je devais utiliser un JtaTransactionManager.

Autres conseils

La classe AbstractTransactionalJUnit4SpringContextTests est autowired à une source de données unique pour permettre seulement le confort de fourniture d'un objet JdbcTemplate injecté. Vous pouvez remplacer la méthode setDataSource(DataSource dataSource) de AbstractTransactionalJUnit4SpringContextTests dans votre sous-classe de test et spécifiez la source de données à utiliser comme ceci:

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

Il vous suffit de fournir le nom de l'une des sources de données Spring doit utiliser pour les méthodes pratiques de jdbcTemplate. Si vous souhaitez étendre AbstractTransactionalJUnit4SpringContextTests est plus pratique que d'autres méthodes mentionnées ci-dessus, vous pouvez le forcer à travailler simplement en choisissant une de vos sources de données.

J'ai trouvé ces détails dans le billet printemps Jira #-4634 SPR.

Vous pouvez définir une des données-sources comme primary="true" dans votre xml, et il sera choisi.

Si vous avez besoin tous threem alors vous ne pouvez pas compter sur autowiring - ReflectionTestUtils d'utiliser pour définir manuellement dans vos tests

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top