2012-09-27 75 views
48

首先,我在StackOverflow上發現了很多關於此的線程,但沒有一個真正幫助我,因此很抱歉詢問可能重複的問題。@Test之後的回滾事務

我正在使用彈簧測試JUnit測試,我的代碼看起來像這樣

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {}) 
public class StudentSystemTest { 

    @Autowired 
    private StudentSystem studentSystem; 

    @Before 
    public void initTest() { 
    // set up the database, create basic structure for testing 
    } 

    @Test 
    public void test1() { 
    }  
    ... 
} 

我的問題是,我想我的測試,以不影響其他測試。 所以我想爲每個測試創建一些類似回滾的東西。 我已經爲此搜尋了很多東西,但到目前爲止我還沒有發現任何東西。 我使用Hibernate和MySQL的這個

+0

回滾是什麼意思?清理數據庫? – Gaurav

+3

將它設置爲與執行'initTest' –

回答

84

只需添加您的測試頂部@Transactional註釋:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"testContext.xml"}) 
@Transactional 
public class StudentSystemTest { 

默認情況下,Spring會開啓一個新的事務周圍的測試方法和@Before/@After回調,回滾末。它在默認情況下工作,在上下文中擁有一些事務管理器就足夠了。

來源:10.3.5.4 Transaction management(粗體礦):

在TestContext框架,交易是通過同時TransactionalTestExecutionListener管理。請注意,TransactionalTestExecutionListener默認配置爲,即使您未在測試類中明確聲明@TestExecutionListeners。但是,要啓用對事務的支持,您必須在由@ContextConfiguration語義加載的應用程序上下文中提供PlatformTransactionManager bean。此外,您必須在課程或方法級別爲您的測試聲明@Transactional

+0

之後的狀態完全相同的狀態,我之前嘗試過,它仍然無效,可能......問題可能是因爲我沒有定義PlatformTransactionManager,我可以這樣做嗎? –

+0

@javo:你如何修改數據庫?如果您使用的是Jpa/Hibernate/JdbcTemplate/...則必須有一些「PlatformTransactionManager」。否則Spring將如何知道您的交易和數據庫? –

+0

此答案中的鏈接不再正確;請參閱[user2418306的答案](http://stackoverflow.com/a/35943700/325900)瞭解Spring文檔中的正確鏈接和更多上下文。 – DaveyDaveDave

0

你需要用衝刺上下文和一個事務管理器,如運行測試,以瞭解更多詳情Spring參考的

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/your-applicationContext.xml"}) 
@TransactionConfiguration(transactionManager="txMgr") 
public class StudentSystemTest { 

    @Test 
    public void testTransactionalService() { 
     // test transactional service 
    } 

    @Test 
    @Transactional 
    public void testNonTransactionalService() { 
     // test non-transactional service 
    } 
} 

見第四章10. Testing

8

提及添加@Transactional的答案是正確的,但爲了簡單起見,您可以僅使用測試類extends AbstractTransactionalJUnit4SpringContextTests

+0

添加註釋在類級別上添加註釋「@Transactional」不起作用,爲每個函數單獨添加註釋「@Transactional」工作,並擴展AbstractTransactionalJUnit4SpringContextTests作品 – user3871754

-5

您可以禁用回滾:

@TransactionConfiguration(defaultRollback = false) 

例子:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration(defaultRollback = false) 
public class Test { 
    @PersistenceContext 
    private EntityManager em; 

    @org.junit.Test 
    public void menge() { 
     PersistentObject object = new PersistentObject(); 
     em.persist(object); 
     em.flush(); 
    } 
} 
+3

這與OP所要求的完全相反 –

2

我知道,我tooooo下旬發佈一個答案,但希望它可以幫助別人。另外,我剛剛解決了我在測試中遇到的這個問題。這是我曾在我的測試:

我的測試類

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "path-to-context" }) 
@Transactional 
public class MyIntegrationTest 

上下文XML

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <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> 

我仍然有這樣的數據庫沒有被自動清除的問題。當我添加下列屬性的BasicDataSource

<property name="defaultAutoCommit" value="false" /> 

希望它可以幫助

問題就解決了。

+0

那麼,那麼您是否手動提交語句?你確定你的數據甚至寫在你的數據庫中嗎? –

11

旁白:試圖修改托馬斯Nurkiewicz的答案被拒絕:

此編輯不會使後哪怕是一點點更容易閱讀,更容易找到,更準確或更易於訪問。更改要麼完全是多餘的,要麼主動損害可讀性。


正確和永久link約集成測試文檔的相關章節。

要啓用支持的交易,你必須配置在ApplicationContext一個PlatformTransactionManager bean,同時通過@ContextConfiguration語義加載。

 
@Configuration 
@PropertySource("application.properties") 
public class Persistence { 
    @Autowired 
    Environment env; 

    @Bean 
    DataSource dataSource() { 
     return new DriverManagerDataSource(
       env.getProperty("datasource.url"), 
       env.getProperty("datasource.user"), 
       env.getProperty("datasource.password") 
     ); 
    } 

    @Bean 
    PlatformTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource()); 
    } 
} 

此外,您必須在類或方法級別的測試宣告春天的@Transactional註解。

 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {Persistence.class, SomeRepository.class}) 
@Transactional 
public class SomeRepositoryTest { ... } 

註解與@Transactional測試方法使測試到一個事務,這將在默認情況下,自動在測試完成後回滾中運行。如果一個測試類用@Transactional標註,則該類層次結構中的每個測試方法都將在一個事務中運行。