J'essaie d'obtenir une annulation de transaction JDBC lors de l'utilisation de Spring-test sans succès. Lorsque je lance ce qui suit, la mise à jour SQL est toujours validée.Annulation de transaction sur les tests Spring JDBC
package my.dao.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
@ContextConfiguration(locations={"classpath:ApplicationContext-test-DAOs.xml"})
@TransactionConfiguration(defaultRollback = true)
public class ConfirmationMatchingDAOImplTest {
@Autowired
private DataSource dataSource;
@Test
public void shouldInsertSomething() throws Exception {
final Connection connection = dataSource.getConnection();
final Statement statement = connection.createStatement();
statement.executeUpdate("insert into TEST_INSERT values (1, 'hello')");
statement.close();
connection.close();
}
}
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://makeitfunky:1490;databaseName=fonzie"/>
<property name="username" value="ralph"/>
<property name="password" value="p0n1es_R_kew1"/>
</bean>
Qu'est-ce que je fais mal?
De plus, est-ce que j'utilise trop d'annotations? Puis-je le rendre un peu plus propre?
J'ai supprimé @TestExecutionListeners et ajouté @Transactional. J'ai ensuite dû ajouter un bean transactionManager au contexte de l'application (DataSourceTransactionManager). Txn n'a pas été restauré, j'ai donc ajouté @TransactionConfiguration (defaultRollback = true). Txn n'était toujours pas annulé et j'ai ajouté @Rollback à la méthode de test. C'est seulement à ce moment-là que j'ai vu le journal de Spring qu'il était en train de reculer le txn, mais la mise à jour est toujours conservée dans la base de données. Quelque chose à voir avec SQL Server et son pilote peut-être? – Synesso
Ajout de DataSourceUtils à ma réponse. –
Ah, je n'ai pas été averti de votre dernier commentaire. En attendant, j'ai changé mon contexte pour envelopper la source de données dans un TransactionAwareDataSourceProxy. Ça a marché. Alors voilà, deux façons de faire la même chose. Maintenant, pour voir laquelle de ces 7 annotations je peux me débarrasser de et continuer à faire fonctionner la chose. – Synesso