簡體   English   中英

Spring 測試中的@Transactional 注解

[英]@Transactional annotation in Spring Test

我正在閱讀有關Spring test Spring 文檔: here

關於在測試中使用@Transactinoal,它說:

如果您的測試是@Transactional,則默認情況下它會在每個測試方法結束時回滾事務。 然而,由於使用帶有 RANDOM_PORT 或 DEFINED_PORT 的這種安排隱式地提供了一個真正的 servlet 環境,HTTP 客戶端和服務器運行在單獨的線程中,因此在單獨的事務中運行。 在這種情況下,在服務器上啟動的任何事務都不會回滾。

我不明白在這種情況下,在服務器上啟動任何事務都不會回滾到底是什么意思

任何幫助表示贊賞。

這意味着您的服務器不會回滾您的更改,因為它將在測試環境之外的另一個環境中運行。 只會回滾您在測試環境中所做的更改。

例如:

@Autowired
private AnyRepository anyRepository;

@Test
@Transactional
void testSave(){
  anyRepository.save(new AnyEntity());
  // Will create an entity from your test environment
}

@Test
@Transactional
void testRead(){
  anyRepository.findAll();
  // Won't find any entities since they were rollbacked
}

相反,如果您使用@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)啟動本地 Spring 實例,例如),它將與您的單元測試環境分離,因此:

@Autowired
MockMvc mvc;

@Test
@Transactional
void testSave(){
  mvc.perform(post(/* enough to create an entity */);
  // Your server, detached from test environment, persists the entity
}

@Test
@Transactional
void testRead(){
  mvc.perform(get(/* enough to get that entity */);
  // Will get previously created entity (if testSave was run before)
}

如果您想在發送 web 請求后回滾,您可以使用@DirtiesContext注釋來重置您的上下文,或者在不使用 DirtiesContext 的情況下在 Spring 的每次測試后檢查重置數據庫

編輯:以下對原始帖子的評論,不清楚您是否需要使用WebEnvironment.RANDOM_PORT或者這是否是一個簡單的問題。
最有可能的是,如果您不需要WebEnvironment.RANDOM_PORT ,您可以簡單地使用WebEnvironment.MOCK ,它在 JUnit 測試的相同環境中運行,因此實際上會回滾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM