1

我在JpaRepository中使用以下方法,該列簡單地更新每列的parent_id列,並使用該列中的特定值。它在純SQL中完美工作,但在Spring Data中失敗。我認爲這是由於事務範圍的一些問題,因爲更新已完成(首次聲明通過)。這只是我無法看到DB中更改了哪些代碼。我想用@Transaction註釋在Spring Boot中進行集成測試

@Transactional 
@Rollback 

因爲我猜這是最好的做法。有沒有什麼辦法可以從我的測試方法中看到代碼中的內容?

@Modifying 
@Query("update MovementCategory mc set mc.parentId = :newParentId where mc.parentId = :previousParentId and mc.userId = :userId") 
int updateChildrenParentId(@Param("userId") long userId, @Param("previousParentId") long previousParentId, @Param("newParentId") long newParentId); 

我創建了一個簡單的集成測試,檢查相關更改在DB設置正確,但它似乎沒有工作,我不能明白爲什麼。我認爲這可能是因爲事務範圍,但我做了一個較小的測試並丟棄它,所以不知道。以下是集成測試。

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MySpringBootMavenApplication.class) 
@WebAppConfiguration 
@IntegrationTest("server.port:0") 
@Transactional 
@Rollback 
public class MovementCategoryRepositoryIT { 

private static final long USER_ID = -1L; 

@Autowired MovementCategoryRepository repo; 

@Test 
public void testUpdateChildrenParentId() { 

    long newParentId= -9723854; 
    long previousParentId = -1239842; 

    MovementCategory mc1 = getFilled(null, "DELETE ME"); 
    mc1.setParentId(previousParentId); 
    mc1 = repo.saveAndFlush(mc1); 

    int updates = repo.updateChildrenParentId(USER_ID, previousParentId, newParentId); 

    // First assert passes, so there update is done 
    assertEquals(1, updates); 

    MovementCategory children1 = repo.findOneByIdAndUserId(mc1.getId(), USER_ID); 

    // Second one fails 
    assertEquals(newParentId, children1.getParentId().longValue()); 

} 

結果:

java.lang.AssertionError: expected:<-9723854> but was:<-1239842> 
    at org.junit.Assert.fail(Assert.java:88) 
    at org.junit.Assert.failNotEquals(Assert.java:834) 
    at org.junit.Assert.assertEquals(Assert.java:645) 
    at org.junit.Assert.assertEquals(Assert.java:631) 
    at com.ldepablo.repository.MovementCategoryRepositoryIT.testUpdateChildrenParentId(MovementCategoryRepositoryIT.java:171) 
    ... 

回答

0

您需要啓動事務讀取明確和也明確回滾事務的REST調用是比測試不同的會話。按照this answer中的描述使用TransactionTemplate。

(當然,應答時間太晚;但這是搜索引擎的第一次打擊)

相關問題