Heim  >  Fragen und Antworten  >  Hauptteil

Java – Unit-Test, wie man Spring Transaktionen verwalten lässt, ohne die Datenbank zu verschmutzen

Ich versuche, spring und junit zu verwenden, um die DAO-Methode zu testen. Ich habe im Internet einige Methoden gesehen, die das deklarative Transaktionsmanagement von Spring (d. h. @Transactional) für Transaktionsvorgänge verwenden und sagen, dass nach Abschluss des Tests spring kann Dadurch wird die Testmethode zurückgesetzt, um den Testzweck zu erreichen.
Dann folgte ich diesem Ansatz und testete die Methode zum Hinzufügen von Vorgängen in dao. Ich stellte fest, dass das Rollback nach der Übermittlung der Transaktion nicht erfolgreich war und in der von mir getesteten Datenbank zusätzliche Daten vorhanden waren. Zuerst dachte ich, es läge daran, dass Spring kein Rollback durchführte, aber später beobachtete ich die Druckinformationen der Konsole und stellte fest, dass es Rollback-Informationen gab, aber warum es fehlschlug, war nicht klar. Ich habe einige verwandte Lösungen gefunden, aber ich habe festgestellt, dass sie mein Problem nicht lösen. Ich bin sehr besorgt, deshalb bin ich hierher gekommen, um Sie um Hilfe zu bitten. Ich hoffe, Sie können mir einen Rat geben.

Das Folgende ist mein Code und die entsprechende Konfiguration

@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 Tage vor1045

Antworte allen(2)Ich werde antworten

  • 我想大声告诉你

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

    用dbunit 结合 spring-test 去测试

    Antwort
    0
  • typecho

    typecho2017-06-12 09:27:30

    Transactional是service层事务,用了就不必在DAO层写事务了

    Antwort
    0
  • StornierenAntwort