2010-10-19 6 views
2

J'essaie de tester mon application avec le framework Spring TestContext. J'ai fait cela en prolongeant AbstractTransactionalJUnit4SpringContextTests, comme d'habitude. Cependant, mon application a trois sources de données différentes (avec des noms comme xDataSource, yDataSource, zdataSource), så quand j'essaie d'exécuter le test, l'autowiring de la source de données dans AbstractTransactionalJUnit4SpringContextTests ne fonctionnera pas, car il cherche une source de données avec autowire -by-type, mais trouve trois, donc il ne sait pas lequel choisir.Comment puis-je faire en sorte que le framework Spring testcontext utilise plusieurs sources de données?

Existe-t-il un moyen d'utiliser Spring TestContext Framework pour utiliser trois sources de données? Si c'est le cas; Comment?

Répondre

2

OK, je l'ai compris. La réponse à cette question est double. Premièrement, étendre AbstractTransactionalJUnit4SpringContextTests ne fonctionnera pas. C'est parce qu'il a besoin d'une seule source de données pour créer le SimpleJdbcTemplate pour vérifier des données avec des requêtes JDBC simples dans le test. Comme je ne pas utiliser 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 deuxième partie était de comprendre que puisque j'ai trois sources de données, j'ai également besoin de tous les trois ainsi être référencé par le même PlatformTransactionManager. J'ai distribué des transactions. C'est impossible avec un DataSourceTransactionManager, donc j'ai dû utiliser un JtaTransactionManager.

+0

Notez que vous n'avez pas besoin de spécifier '@ TestExecutionListeners' - ces écouteurs sont activés par défaut. – axtavt

0

Vous pouvez définir l'une des sources de données sous la forme primary="true" dans votre fichier XML et elle sera choisie.

Si vous avez besoin de toutes ces options, vous ne pouvez pas vous fier à l'autowiring - utilisez ReflectionTestUtils pour le configurer manuellement dans vos tests.

+0

Ce n'est pas assez bon - j'ai besoin des trois. – mranders

+0

alors vous ne pouvez pas compter sur autowiring. Voir mise à jour – Bozho

+0

Je ne compte pas nécessairement sur autowiring, mais le fait est que 'AbstractTransactionalJUnit4SpringContextTests' autowires une source de données. Ceci est à utiliser dans le simpleJdbcTemplate que la classe propose pour faire des requêtes simples dans le test. Si je configure le test en utilisant uniquement des annotations, le problème disparaît. Cependant, je veux que toutes les sources de données s'exécutent dans la même transaction. – mranders

1

La classe AbstractTransactionalJUnit4SpringContextTests est auto-alimentée à une source de données unique uniquement pour permettre la 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 du ressort de source unique de données doivent utiliser pour les jdbcTemplate méthodes pratiques. Si l'extension AbstractTransactionalJUnit4SpringContextTests est plus pratique que les autres méthodes mentionnées ci-dessus, vous pouvez l'obliger à travailler en choisissant simplement l'une de vos sources de données.

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

Questions connexes