-1

我是Spring测试的新手,我已经按照文档一步一步成功地运行了很多单元测试,但是我有一些问题:

1 所有的TestCase都可以使用全局的Spring Context吗

现在我像这样配置每个 TeseCase 的 spring 上下文:

@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();
        }
    }
}

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

我想念什么吗?

4

1 回答 1

1

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

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

public class ConcreteTests1 extends AbstractSpringTests

public class ConcreteTests2 extends AbstractSpringTests

在这种情况下,spring 应该只设置一个应用程序上下文。

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

如果您希望提交事务——不寻常,但在您希望特定测试填充或修改数据库时偶尔有用——可以通过 @TransactionConfiguration 和 @Rollback 注释指示 TestContext 框架导致事务提交而不是回滚.

于 2013-09-22T03:56:55.720 回答