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)
...