2015-04-17 68 views
5

我有Spring Data Rest的Spring Boot應用程序,我在集成測試中使用@WebIntegrationTest以及TestRestTemplate。用於測試的基類看起來是這樣的:Spring Boot @WebIntegrationTest和TestRestTemplate - 是否可以回滾測試事務?

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles(profiles = "test") 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration 
@WebIntegrationTest("server.port: 0") 
public abstract class IntegrationTest { 

    ... 

} 

我通過使用TestRestTemplate執行POST請求的資源測試一個實體的創建。問題在於,即使認爲我的測試配置爲事務性的,在數據​​庫上堅持實體的事務也不會回滾,因此實體在測試後仍保留在數據庫中。我有種理解,因爲在測試中回滾的事務與持久化實體的事務不同。

現在我的問題是,是否有任何方式回滾在測試方法中通過RestTemplate發出的請求觸發的事務?

+1

我會說沒有,唯一的辦法就是手動刪除添加的條目(春季TestContext框架作者)... –

+0

FYI:您可以安全地刪除'@ TransactionConfiguration'聲明:它在這裏沒有任何作用。 –

回答

16

有回滾通過在測試方法RestTemplate提出的 請求觸發交易的任何方式?

不可以。回滾由您部署的應用程序管理的事務是不可能的。

當您使用@WebIntegrationTest@SpringApplicationConfiguration註釋測試類時,Spring Boot將啓動嵌入式Servlet容器並在其中部署應用程序。所以從這個意義上說,你的測試和應用程序運行在兩個不同的過程中。

The Spring TestContext Framework只管理Test-managed transactions。因此,測試類中@Transactional的存在僅影響本地測試管理事務,而不影響不同過程中的事務。

正如其他人已經提到的,解決方法是在測試完成後重置數據庫的狀態。爲此你有幾個選擇。有關詳細信息,請參閱參考手冊的Executing SQL scripts部分。

問候,

山姆

+0

謝謝你的幫助。我認爲這是答案。我已經重置了數據庫狀態。乾杯。 –

+0

最後一個問題。如果測試和應用程序在兩個不同的進程中運行,如何仍然可以將其組件注入到測試類中? –

+0

當我說_不同的process_時,這可能有點誤導。嵌入式容器和您的測試在相同的JVM進程中運行;但是,嵌入式Servlet容器自然會在其自己的線程池的不同線程中執行請求。由於Spring的事務支持基於'ThreadLocal's,所以不同線程的概念對於事務邊界是重要的。然而'ApplicationContext'是在測試線程中啓動的。因此,即使這些組件在容器的線程中執行,上下文中的組件也可以注入到您的測試中。 –

相關問題