¿Cómo puedo hacer que las fuentes de marco TestContext primavera uso de datos múltiples?
-
09-10-2019 - |
Pregunta
Estoy tratando de prueba de integración con mi solicitud framework Spring TestContext. He hecho esto extendiendo AbstractTransactionalJUnit4SpringContextTests
, como de costumbre. Sin embargo, mi solicitud tiene tres fuentes de datos diferentes (con nombres como xDataSource, yDataSource, zdataSource), SA cuando trato de ejecutar la prueba, el autowiring de fuente de datos en AbstractTransactionalJUnit4SpringContextTests
no funcionará, ya que busca una fuente de datos con Autowire -by-tipo, pero se encuentra con tres, por lo que no sabe cuál elegir.
¿Hay alguna manera de obtener Resorte del marco TestContext de usar tres fuentes de datos? Si es así; ¿cómo?
Solución
De acuerdo, lo he descubierto. La respuesta a esta pregunta es doble. En primer lugar, se extiende AbstractTransactionalJUnit4SpringContextTests
no funcionará. Esto se debe a que necesita una única fuente de datos para la creación de la SimpleJdbcTemplate
para la verificación de la materia con simples consultas JDBC en la prueba. Puesto que yo no uso esta característica en esta prueba, podría sustituir a extends AbstractTransactionalJUnit4SpringContextTests
con la configuración collowing:
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class
})
@Transactional
public class IntegrationTest {
...
}
La combinación de estas anotaciones da la misma configuración que se extiende AbstractTransactionalJUnit4SpringContextTests
.
La segunda parte fue la comprensión de que ya que tengo tres fuentes de datos, también necesita los tres así que hacer referencia a la misma PlatformTransactionManager
. He distribuido transacciones. Esto es imposible con un DataSourceTransactionManager
, así que tuve que utilizar un JtaTransactionManager
.
Otros consejos
La clase AbstractTransactionalJUnit4SpringContextTests
se autowired a una sola fuente de datos sólo para permitir la conveniencia de proporcionar un objeto JdbcTemplate
inyectado. Puede reemplazar el método de setDataSource(DataSource dataSource)
AbstractTransactionalJUnit4SpringContextTests
en la subclase de prueba y especificar la fuente de datos para utilizar como esto:
@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
Usted sólo tiene que proporcionar el nombre de la fuente de datos de Primavera debe utilizar para los métodos jdbcTemplate
de conveniencia. Si se extiende AbstractTransactionalJUnit4SpringContextTests
es más conveniente que otros métodos mencionados anteriormente, entonces se puede obligarlo a trabajar con sólo elegir una de sus fuentes de datos.
He encontrado estos detalles en la primavera de entradas Jira # SPR-4634 .
Se puede definir una de las fuentes de datos como en su primary="true"
xml, y será elegido.
Si necesita toda threem entonces usted no puede confiar en autowiring - ReflectionTestUtils
uso para configurar manualmente en sus pruebas