Pourquoi sont des opérations ne pas rouler en arrière lors de l'utilisation de SpringJUnit4ClassRunner/MySQL/Spring/Hibernate
Je suis en train de faire les tests unitaires et j'attends que toutes les données validées de la base de données MySQL sera annulée... mais ce n'est pas le cas. Les données sont validées, même si mon journal a été montrant que la restauration qui se passait. J'ai été à la lutte avec ce pour un couple de jours, donc mon installation a un peu changé, voici ma configuration actuelle.
LoginDAOTest.java:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:web/WEB-INF/applicationContext-test.xml", "file:web/WEB-INF/dispatcher-servlet-test.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class UserServiceTest {
private UserService userService;
@Test
public void should_return_true_when_user_is_logged_in ()
throws Exception
{
String[] usernames = {"a","b","c","d"};
for (String username : usernames)
{
userService.logUserIn(username);
assertThat(userService.isUserLoggedIn(username), is(equalTo(true)));
}
}
ApplicationContext-Text.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/******"/>
<property name="username" value="*****"/>
<property name="password" value="*****"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="userService" class="Service.UserService">
<property name="userDAO" ref="userDAO"/>
</bean>
<bean id="userDAO" class="DAO.UserDAO">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>/himapping/User.hbm.xml</value>
<value>/himapping/setup.hbm.xml</value>
<value>/himapping/UserHistory.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory"/>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
</beans>
J'ai lu sur la question, et j'ai déjà vérifié pour s'assurer que la base de tables de base de données sont configurés pour utiliser InnoDB. Aussi, je ont été capable de mener à bien la restauration des opérations à l'extérieur de ma suite de tests. Donc, ce doit être une sorte de mauvaise configuration de ma part.
Toute aide serait grandement appréciée 🙂
OriginalL'auteur Trevor | 2010-05-13
Vous devez vous connecter pour publier un commentaire.
Le problème s'est avéré être que la connexion a été auto-engager AVANT que la transaction peut être annulée. J'ai dû changer ma source de données de la fève à inclure un defaultAutoCommit propriété:
OriginalL'auteur Trevor
Pour moi defaultAutoCommit et @Transactional n'a pas aidé. J'ai dû changer db type InnoDB
OriginalL'auteur Bilgin Ibryam
Ce doit être utilisé
TransactionalTestExecutionListener contient isRollback() qui annule les
transaction après la méthode de test.
OriginalL'auteur Saurabh
J'espère que j'ai raison et que c'est simple. Il vous manque de l' @Transactional annotation sur votre classe de test. Cela signifie que la méthode d'analyse elle-même n'est pas exécuté dans une transaction, et donc il n'y a rien à faire reculer. Espérons que cette aide.
Pour des raisons d'être approfondie... comme mentionné avant, j'ai changé ma configuration tout à fait à quelques reprises, et la configuration j'ai posté ci-dessus n'apparaissait pas dans les journaux que les transactions étaient roulant en arrière... quand j'ai ajouté le @Transactional annotation, il est maintenant montrant que les opérations sont annulées dans les journaux, mais il est encore à commettre le DB. J'ai aussi eu à retoucher mes bibliothèques un peu, j'ai eu à traquer la version 3.2 de l'asm.jar fichier, que j'ai été prendre une "méthode introuvable" exception pour l'ASM de la bibliothèque.
Trevor, par hasard, avez-vous des transactionnel des annotations ou des contrôles dans le service à l'usager lui-même. La validation peut être due à une REQUIRES_NEW propagation de la valeur quelque part sur la chaîne des transactions. Un autre test que j'ai irait à l'est de simplement insérer un enregistrement à l'aide de l'utilisateur DAO directement dans th DB à l'aide de la transaction de test et assurez-vous qu'il est en marche arrière. Si quelque chose est en place avec l'ensemble de la transaction en veille prolongée. Pouvez-vous fournir plus de détails sur ce que fait le service?
OriginalL'auteur Gennadiy
Une autre façon de résoudre votre problème:
Au lieu d'utiliser:
ce qui crée une table MyISAM par défaut, donc pas de prise en charge des transactions
Essayez d'utiliser
qui crée les tables InnoDB, et donc prend en charge les transactions.
OriginalL'auteur actfong