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?

¿Fue útil?

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

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top