2013-08-24 72 views
0

我在Spring测试新的,我已经成功地根据文件一步一步跑了很多单位的测试,但我有一些问题:弹簧测试情境范围

1可以将所有的TestCase使用全球Spring上下文

现在我配置每个TeseCase这样Spring上下文:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(.....) 
@Transactional 
public class UserDaoTests {} 


@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(.....) 
@Transactional 
public class AccoutDaoTests {} 

如图所示,弹簧将加载并一次又一次地摧毁相同的上下文。

所以我想知道我是否可以设置一个全局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(); 
     } 
    } 
} 

然后运行测试,我发现所有的测试都顺利通过,但是当我检查数据库后,发现有一些测试数据插入,看起来回滚不起作用。

我错过了什么吗?

回答

1

Spring应该检测它是否可以为您设置共享应用程序上下文。你是否在不同的测试用例中指定了不同的xmls?如果你的测试用例可以对运行在共享应用程序上下文,你可以尝试使用:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(.....) 
public abstract class AbstractSpringTests 

public class ConcreteTests1 extends AbstractSpringTests 

public class ConcreteTests2 extends AbstractSpringTests 

在这种情况下,春季应设置只有一个应用程序上下文。

据参考,您应该添加@TransactionConfiguration而不是@Transactinal在测试类(回滚是默认的策略,如果我没有记错)

如果你想有一个事务提交 - 不寻常的,但是当您想要特定的 测试来填充或修改数据库时偶尔会很有用 - 可以指示TestContext框架使事务提交而不是通过@TransactionConfiguration和@Rollback 注释进行回滚。