gpt4 book ai didi

java - 每次单元测试后回滚

转载 作者:行者123 更新时间:2023-11-29 04:49:17 25 4
gpt4 key购买 nike

我使用 Spring、Hibernate 和 MySQL 开发应用程序。我为我的一张表创建了 DAO。现在,我想测试 DAO 的方法(保存、查找等)。问题是这些方法影响数据库数据,所以我想在特定方法执行后回滚所有更改。我尝试通过在 @TransactionConfiguration 中设置 defaultRollback=true 来做到这一点,但它不起作用。下面我粘贴了最重要的代码片段。有谁知道如何在每种方法后强制回滚?

我在 MySQL 中的表使用的是 InnoDB 引擎。事实上,测试执行后控制台包含以下信息:信息:在测试上下文的测试执行后回滚事务 ... 但数据库中的更改已提交。

用户DAO测试

@ContextConfiguration(locations={"classpath:applicationContext.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@Transactional
public class UsersDAOTest {

@Autowired
UsersHibernateDAO usersDAO;

@Test
public void test1() {
List<Users> results = usersDAO.findAll();
Assert.assertEquals(0, results.size());
}

@Test
public void test2() {
Users user = new Users("mchrobok", "12345678901234567890123456789012");
usersDAO.saveOrUpdate(user);
List<Users> results = usersDAO.findAll();
Assert.assertEquals(1, results.size());
}
}

hibernate (hibernate.cfg.xml)

<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>

<mapping class="pl.fp.microblog.domain.Users"/>
</session-factory>
</hibernate-configuration>

Spring配置(applicationContext.xml)

<beans>
<context:component-scan base-package="pl.fp.microblog" />
<tx:annotation-driven />

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<beans:property name="url" value="jdbc:mysql://localhost:3306/Microblog"/>
<beans:property name="username" value="root"/>
<beans:property name="password" value="root"/>
</beans:bean>

<beans:bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="configLocation">
<beans:value>
hibernate.cfg.xml
</beans:value>
</beans:property>
</beans:bean>

<beans:bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>

<beans:bean name="usersDAO" class="pl.fp.microblog.dao.UsersHibernateDAO">
<beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>
</beans:beans>

编辑

UsersDAO(很通用,但没关系)

public class GenericHibernateDAO<T> implements GenericDAO<T> {
private SessionFactory sessionFactory;
private Class<?> persistClass;

public GenericHibernateDAO() {
ParameterizedType type = ((ParameterizedType)getClass().getGenericSuperclass());
persistClass = ((Class<?>) type.getActualTypeArguments()[0]);
}

public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

@Override
public List<T> findAll() {
Criteria criteria = sessionFactory.openSession().createCriteria(persistClass);
return criteria.list();
}

@Override
public void saveOrUpdate(T entity) {
sessionFactory.openSession().saveOrUpdate(entity);
}
}

最佳答案

您正在 hibernate 代码中打开一个新 session ,您应该改用 getCurrentSession()。

您的代码中的问题是您的 DAO 类试图自行管理事务。在现代 Spring 应用程序中,事务管理应该在服务层执行。

所以这意味着通常您的服务方法应该使用 @Transactional 进行注释。

关于java - 每次单元测试后回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13781838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com