簡體   English   中英

事務測試無法更新/刪除

[英]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.

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