[英]Transactional test can't update/delete
我有一個@Repository
,它有一些更新表的不同查詢。 這些方法沒有使用@Transactional
注釋,因為事務處於服務級別。
我想測試這些存儲庫。 我創建了一個測試 class 並用@Transactional
注釋但是當調用存儲庫方法時它們會失敗:
Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
如果我用@Transactional
注釋每個存儲庫方法,它會修復錯誤,但我不想更改主代碼庫。 我應該能夠在測試中創建交易。
我創建了一些示例代碼來展示我的一般結構。
存儲庫
@Repository
public class ExampleRepo extends JPARepository<X, Y> {
// Adding @Transactional here fixes the test
@Modifying
@Query("update Example e set e.example=:example where e.id = :id")
int exampleQuery(@Param("example") String example, @Param("id") int id);
}
測試
@Transactional
@SpringBootApplication
@SpringBootTest
public class RepoTest {
private final ExampleRepo repository;
@Autowired
public RepoTest(final ExampleRepo repository){
this.repository = repository;
}
@Test
void testExample() {
// Fails
repository.exampleQuery("example", 1);
}
}
例外
Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
不應該將測試注釋為“@Transactional”來解決這個問題嗎?
我能找到的所有例子都使用它。 如果我用@Transactional
注釋每個單獨的測試,它仍然會失敗。
你為什么用 @SpringBootApplication 注釋你的測試@SpringBootApplication
? 不推薦,反正。 它可能只是為了快速測試,我不知道你想測試什么方法,但是例如測試下面代碼的保存方法是一個好方法。 試試看它是否適合你。
@SpringBootTest
@RunWith(SpringRunner.class)
public class RepoTest {
@Autowired
private ExampleRepo repository;
@Test
@Transactional
public void save_() {
Object savedObj = repository.save(entity);
assertNotNull(savedObj.getId());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.