Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Spring测试上下文范围_Unit Testing_Spring Mvc_Spring Test - Fatal编程技术网

Unit testing Spring测试上下文范围

Unit testing Spring测试上下文范围,unit-testing,spring-mvc,spring-test,Unit Testing,Spring Mvc,Spring Test,我是Spring测试新手,根据文档一步一步地成功运行了很多单元测试,但是我有一些问题: 1所有测试用例都可以使用全局Spring上下文吗 现在我将每个TeseCase配置为spring上下文,如下所示: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(.....) @Transactional public class UserDaoTests {} @RunWith(SpringJUnit4ClassRunner

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

1所有测试用例都可以使用全局Spring上下文吗

现在我将每个TeseCase配置为spring上下文,如下所示:

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


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(.....)
@Transactional
public class AccoutDaoTests {} 
如图所示,spring将一次又一次地加载和销毁相同的上下文

所以我想知道我是否可以设置一个全局Spring上下文,然后让所有的测试用例在这个上下文中运行

2交易管理

它说事务管理器将把操作回滚到数据库

但我还没有发现在哪种情况下该功能会起作用

因为在我的应用程序中,我使用ORMLite而不是SpringJDBC

这是配置:

<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();
        }
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@上下文配置(…)
@交易的
公共类UserDaoTests{
@自动连线
私有道用户道;
@试验
公共void testCreate(){
用户u=新用户();
u、 设置名称(“ysl”);
u、 setLocked(true);
试一试{
userDao.create(u);
}捕获(SQLE异常){
log.error(例如getMessage());
e、 printStackTrace();
}
}
}
然后我运行了测试,我发现所有的测试都成功通过了,但是当我检查数据库时,我发现插入了一些测试数据,似乎回滚不起作用


我遗漏了什么吗?

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

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

public class ConcreteTests1 extends AbstractSpringTests

public class ConcreteTests2 extends AbstractSpringTests
在这种情况下,spring应该只设置一个应用程序上下文

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

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


这是同一篇文章中两个截然不同的问题。这使得回答问题更加困难。请分别张贴问题。