Question

J'essaie d'exécuter un script SQL dans mon test JUNIT à l'aide du ressort. Le script est utilisé pour configurer des données pour les tests. Cependant, lorsque le script est exécuté, les insertions du script sont en train d'être engagées après chaque test. La documentation de printemps dit de ne pas attendre la restauration avec DDL, mais tout dans mon script est DML. Tout ce qu'il contient est d'insérer des relevés et d'obtenir le dernier identifiant d'insertion (SET @blah= last_insert_id ()).

suis-je en train de configurer quelque chose de mal? J'utilise cela contre une base de données MySQL. Notre configuration est la suivante:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class OrderTestCase extends AbstractTransactionalJUnit4SpringContextTests {

    @Before
    public void runSql() {
        String fileName = StringUtils.replace(getClass().getName(), ".", "/") + ".sql";
        Resource resource = applicationContext.getResource(fileName);
        if (resource.exists()) {
            executeSqlScript(fileName, false);
        } else {
            LOGGER.debug("Resource doesn't exist: {}", resource);
        }
    }

@Test
public void testLoadOrders() {
    Collection<Order> orders= dao.findAll();
    assertTrue(orders.size() == 3);
}
}

Voici ce que je pense se produire sur la base de certaines recherches. Le premier appel à exécuterQlscript fonctionne dans une transaction distincte. Simple's SimpleJDbCtMapate.UPDate Methodate est appelé par ExecutsQlscript. Parce qu'il s'agit d'une connexion JDBC sur une connexion JDBC, qui est obtenue à partir d'un pool de connexion, je ne suis pas garantie d'obtenir la même connexion sur les accès ultérieurs à la DB et ne peut donc pas être garantie de fonctionner dans la même transaction.

Si je devais faire toutes mes opérations de base de données via TransactionManager ou (usine de session Hibernate), cela fonctionnerait en raison de la portée des opérations internes. Mes options ici sont à:

  1. Trouvez comment exécuter SimpleJDbctemplate.UPDate et le code actuel ultérieur que je teste dans la même transaction. Je pense que je peux éventuellement faire cela, mais mes efforts à ce jour ont été infructueux.

  2. Toutes mes données de test sont configurées via la sessionFactory. Ainsi, au lieu d'exécuter des scripts SQL droit via JDBC, je vais peupler des objets de modèle et les persisterais à travers un hibernate Dao.

  3. Suis-je sur la bonne voie ici? Quelqu'un peut-il fournir plus de conseils?

Était-ce utile?

La solution 2

J'ai pu résoudre ceci en ajoutant le «JPavendoradapter» suivant à la Déclaration de mon entitéManagerFactory.

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
    <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
</bean>

Autres conseils

Vous avez probablement activé automatiquement activé sur la connexion DB.

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="defaultAutoCommit" value="false"/>
</bean>

Notez que vous pouvez également transmettre cet argument dans l'URL JDBC.

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