Maison  >  Questions et réponses  >  le corps du texte

java - tests unitaires, comment laisser Spring gérer les transactions sans polluer la base de données

J'essaie d'utiliser spring et junit pour tester la méthode DAO. J'ai vu sur Internet des méthodes qui utilisent la gestion déclarative des transactions de Spring (c'est-à-dire @Transactional) pour les opérations de transaction, disant qu'une fois le test terminé, Spring peut Cela fera revenir la méthode de test pour atteindre l'objectif du test.
Ensuite, j'ai suivi cette approche et testé la méthode d'ajout d'opérations dans dao J'ai découvert qu'après la soumission de la transaction, la restauration n'avait pas réussi et qu'il y avait des données supplémentaires dans la base de données que j'ai testée. Au début, je pensais que c'était parce que Spring n'effectuait pas de restauration, mais plus tard, j'ai observé les informations d'impression de la console et j'ai découvert qu'il y avait des informations de restauration, mais la raison de l'échec n'était pas claire. J'ai trouvé des solutions connexes, mais j'ai constaté qu'elles ne résolvaient pas mon problème. Je suis très troublé, alors je suis venu ici pour vous demander de l'aide. J'espère que vous pourrez me donner quelques conseils.

Ce qui suit est mon code et la configuration correspondante

@Override
    public void addUser(User u) {
        Session session = sessionFactory.openSession();
        Transaction tc = session.getTransaction();
        try {
            tc.begin();
            session.save(u);
            tc.commit();
        }catch(Exception e){
            tc.rollback();
            e.printStackTrace();
        }
        return ;
    }
<bean id="txManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="txManager" />
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/services.xml"})
@Transactional(transactionManager = "txManager")
@Rollback(true)
public class UserServiceImplTest {
    
    @Autowired
    UserDAO userDAO;  //自动装配userDAO
    
    @Test
    public void testAddUse(){
        User u = new User();
        u.setLevel(3);
        u.setName("ab11");
        u.setPassword("hh");
        userDAO.addUser(u);
        Assert.assertEquals(u.getName(), userDAO.getUserList().get(userDAO.getUserList().size()-1).getName());
    }
信息: Using DataSource [org.apache.commons.dbcp2.BasicDataSource@498d318c] of Hibernate SessionFactory for HibernateTransactionManager
六月 02, 2017 4:46:19 下午 org.springframework.test.context.transaction.TransactionContext startTransaction
信息: Began transaction (1) for test context [DefaultTestContext@52d6cd34 testClass = UserServiceImplTest, testInstance = com.dxzh.mall.serviceImpl.test.UserServiceImplTest@715d6168, testMethod = testAddUse@UserServiceImplTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@75798d03 testClass = UserServiceImplTest, locations = '{classpath:/services.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.hibernate5.HibernateTransactionManager@c6634d]; rollback [true]
Fri Jun 02 16:46:19 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Hibernate: insert into user (name, password, level) values (?, ?, ?)
六月 02, 2017 4:46:19 下午 org.springframework.test.context.transaction.TransactionContext endTransaction
信息: Rolled back transaction for test context [DefaultTestContext@52d6cd34 testClass = UserServiceImplTest, testInstance = com.dxzh.mall.serviceImpl.test.UserServiceImplTest@715d6168, testMethod = testAddUse@UserServiceImplTest, testException = java.lang.RuntimeException, mergedContextConfiguration = [MergedContextConfiguration@75798d03 testClass = UserServiceImplTest, locations = '{classpath:/services.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]].
六月 02, 2017 4:46:19 下午 org.springframework.context.support.GenericApplicationContext doClose
信息: Closing org.springframework.context.support.GenericApplicationContext@3ffc5af1: startup date [Fri Jun 02 16:46:13 CST 2017]; root of context hierarchy
阿神阿神2686 Il y a quelques jours1049

répondre à tous(2)je répondrai

  • 我想大声告诉你

    我想大声告诉你2017-06-12 09:27:30

    Utilisez dbunit combiné avec spring-test pour tester

    répondre
    0
  • typecho

    typecho2017-06-12 09:27:30

    Transactional est une transaction de couche de service si vous l'utilisez, vous n'avez pas besoin d'écrire des transactions au niveau de la couche DAO

    .

    répondre
    0
  • Annulerrépondre