2013-08-24 71 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 註釋進行回滾。