Domanda

Sto cercando di test di integrazione con la mia applicazione framework Spring TestContext. L'ho fatto estendendo AbstractTransactionalJUnit4SpringContextTests, come al solito. Tuttavia, la mia domanda ha tre diverse fonti di dati (con nomi come xDataSource, yDataSource, zdataSource), SA quando si tenta di eseguire il test, l'autowiring di origine dati in AbstractTransactionalJUnit4SpringContextTests non funziona, dal momento che cerca una fonte di dati con autowire -da-tipo, ma trova tre, in modo che non sa quale scegliere.

C'è un modo per ottenere primavera TestContext Framework da utilizzare tre fonti di dati? Se è così; come?

È stato utile?

Soluzione

OK, ho capito. La risposta a questa domanda è duplice. In primo luogo, estendendo AbstractTransactionalJUnit4SpringContextTests non funzionerà. Questo è perché ha bisogno di un'unica fonte di dati per la creazione del SimpleJdbcTemplate per verificare cose con semplici query JDBC nel test. Dal momento che io non uso questa funzione in questo test, ho potuto sostituirlo extends AbstractTransactionalJUnit4SpringContextTests con la configurazione collowing:

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

La combinazione di queste annotazioni dà la stessa configurazione come estendentesi AbstractTransactionalJUnit4SpringContextTests.

La seconda parte è stata la comprensione che da quando ho tre fonti di dati, ho anche bisogno di tutte e tre in modo da fare riferimento con lo stesso PlatformTransactionManager. Ho distribuito le transazioni. Questo è impossibile con un DataSourceTransactionManager, così ho dovuto usare un JtaTransactionManager.

Altri suggerimenti

La classe AbstractTransactionalJUnit4SpringContextTests è autowired ad un'unica fonte di dati solo per permettere la comodità di fornire un oggetto JdbcTemplate iniettato. È possibile eseguire l'override del metodo setDataSource(DataSource dataSource) dal AbstractTransactionalJUnit4SpringContextTests nella sottoclasse di test e specificare l'origine dati da utilizzare in questo modo:

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

Non vi resta che fornire il nome della fonte di un data primavera dovrebbe usare per i metodi jdbcTemplate convenienza. Se si estende AbstractTransactionalJUnit4SpringContextTests è più conveniente rispetto ad altri metodi di cui sopra, allora si può costringerlo a lavorare da solo scegliendo una delle fonti di dati.

Ho trovato questi dettagli in primavera biglietto Jira # SPR-4634 .

È possibile definire una delle fonti dati come primary="true" in xml, e sarà scelto.

Se avete bisogno di tutto threem allora non si può fare affidamento su autowiring - uso ReflectionTestUtils per impostare manualmente nei test

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top