我是Spring测试的新手,我已经逐步按照文档成功运行了很多单元测试,但是我有一些问题:
1所有TestCase都可以使用全局Spring Context
现在我将每个TeseCase配置为弹簧上下文:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(.....)
@Transactional
public class UserDaoTests {}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(.....)
@Transactional
public class AccoutDaoTests {}
如图所示,spring会一次又一次地加载并破坏相同的上下文。
所以我想知道我是否可以设置全局Spring上下文,然后让所有TestCases在这个上下文中运行?
2交易管理
它说事务管理器会将操作回滚到数据库。
但是我没有发现这个功能在哪种情况下会起作用。
因为在我的应用程序中我使用ORMLite而不是Spring JDBC。
这是配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- our daos -->
<bean id="ormliteSource" class="com.j256.ormlite.jdbc.DataSourceConnectionSource" init-method="initialize">
<constructor-arg index="0" ref="dataSource"/>
<constructor-arg index="1" value="${jdbc.url}"/>
</bean>
<bean id="userDao" class="com.j256.ormlite.spring.DaoFactory" factory-method="createDao">
<constructor-arg index="0" ref="ormliteSource"/>
<constructor-arg index="1" value="com.springapp.model.User"/>
</bean>
然后在我的测试用例中:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(..)
@Transactional
public class UserDaoTests {
@Autowired
private Dao<User, Long> userDao;
@Test
public void testCreate() {
User u = new User();
u.setName("ysl");
u.setLocked(true);
try {
userDao.create(u);
} catch (SQLException e) {
log.error(e.getMessage());
e.printStackTrace();
}
}
}
然后我运行测试,我发现所有测试都成功通过,但是当我检查数据库时,我发现插入了一些测试数据,似乎回滚不起作用。
我会错过什么吗?
答案 0 :(得分:1)
Spring应该检测它是否可以为您设置共享的应用程序上下文。您是否在不同的测试用例中指定了不同的xmls?如果您的测试用例可以针对共享应用程序上下文运行,您可以尝试使用:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(.....)
public abstract class AbstractSpringTests
public class ConcreteTests1 extends AbstractSpringTests
public class ConcreteTests2 extends AbstractSpringTests
在这种情况下,spring应该只设置一个应用程序上下文。
根据参考文献,您应该在测试类上添加@TransactionConfiguration而不是@Transactinal(如果我没有弄错的话,回滚是默认策略)
如果你想要一个事务提交 - 不寻常,但偶尔有用时你想要一个特定的 测试以填充或修改数据库 - 可以指示TestContext框架导致 提交事务而不是通过@TransactionConfiguration和@Rollback回滚 注释