Annulation de transaction sur les tests Spring JDBC
Je vais essayer d'obtenir JDBC annulation de la transaction lors de l'utilisation de Printemps-test sans succès. Quand je lance la suite de la mise à jour SQL est toujours engagé.
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>
Ce que je fais mal?
De plus, suis-je utiliser un trop grand nombre d'annotations? Puis-je le faire un peu plus propre?
source d'informationauteur Synesso
Vous devez vous connecter pour publier un commentaire.
Si vous n'avez pas explicitement configurer l'exécution d'un test d'auditeurs à l'aide de la
@TestExecutionListeners
annotation, Printemps configure par défautDependencyInjectionTestExecutionListener
DirtiesContextTestExecutionListener
etTransactionalTestExecutionListener
.TransactionalTestExecutionListener
offre transactionnelle de l'exécution du test avec par défaut la sémantique de restauration. En déclarant explicitement@TestExecutionListeners
sur votre classe de test et en omettantTransactionalTestExecutionListener
d'auditeurs de la liste, vous êtes à la désactivation de la prise en charge transactionnelle.Vous devez également ajouter le
@Transactional
annotation à la classe ou au niveau de la méthode.Vous devez également utiliser DataSourceUtils pour obtenir une transactionnel Connexion gérée par DataSourceTransactionManager.
Si vous utilisez le non-xml cette méthode fonctionne très bien depuis la version 3.1
Le test de config puis prend cette forme. Avis de @EnableTransactionManagement et le fait que vous pouvez déclarer un test global defaultRollback. Cela devient particulièrement utile sur les grands projets.
}
ajouter cette annotation, et pas de faire reculer le seront dans des cas de test:
Mon annotation ressemble à ceci:
Serait-ce parce que vous n'avez pas de
@Transactional
pour la méthode d'essai?Lors de l'utilisation de la @Transactional annotation au Printemps, vous devez ajouter la ligne suivante à votre fichier de configuration Spring:
Le gestionnaire de transactions de propriété contient une référence à la transaction manager bean défini dans le fichier de configuration Spring. Ce code indique Printemps à utiliser le @Transaction annotation lors de l'application de l'opération de l'intercepteur. Sans elle, l' @Transactional annotation est ignoré, résultant en l'absence de transaction utilisés dans votre code.
Source sur le site web d'IBM
informations complémentaires :
pour cette ligne
La valeur par défaut de la
transaction-manager
attribut est "transactionManager".Cet attribut est requis uniquement si le bean id/nom de la transactionManager n'est pas "transactionManager'.
Si vous avez juste à définir :
Vous devez ajouter
@Transactional
au niveau de la classe.Quelque chose comme ceci :
Ici
txManager
est une instance ou bean id de Transaction manager deapplication context
.