我使用 HSQLDB 進行測試。問題是,當我在init()方法中添加一些數據時,我只能從首先運行的測試中獲取該數據。@Beforepublic void init() { if(isRun) return; isRun = true; Role role = new Role(); role.setId(1); role.setType("User"); roleDAO.save(role); User user = new User(); user.setCredits(1000); user.setEmail("[email protected]"); user.setUsername("User"); user.setPassword("qwerty"); user.setRoles(new HashSet<Role>(Arrays.asList(roleDAO.findById(1)))); userDAO.save(user); User user2 = new User(); user2.setCredits(1000); user2.setEmail("[email protected]"); user2.setUsername("User2"); user2.setPassword("qwerty"); user2.setRoles(new HashSet<Role>(Arrays.asList(roleDAO.findById(1)))); userDAO.save(user2);}@Testpublic void findUserByIdTest() { User user = userDAO.findByUsername("User"); assertEquals(userDAO.findById(user.getId()), user);}@Testpublic void addUserTest() { User user = new User(); user.setCredits(1000); user.setEmail("[email protected]"); user.setPassword("qwerty"); user.setUsername("Antony"); user.setRoles(new HashSet<Role>(Arrays.asList(roleDAO.findById(1)))); userDAO.save(user); assertEquals(userDAO.findByUsername("Antony"), user);}@Testpublic void updateUserTest() { User user = userDAO.findByUsername("User"); user.setCredits(0); assertEquals(userDAO.findByUsername("User").getCredits(), (Integer) 0);}@Testpublic void removeUserTest() { userDAO.remove(userDAO.findByUsername("User")); assertNull(userDAO.findByUsername("User"));}碰巧該removeUserTest()方法總是首先運行,當我findAll()數據時,我會看到我在init()方法中設置的數據。之后,其他測試方法運行,但如果我在findAll()那里運行,它只會返回任何內容,這意味著不存在數據。另外,我已經設置了 hibernate.hbm2ddl.auto=create。我在這里錯過了什么?為什么我可以在第一個運行方法中獲取數據,但在其他方法中數據就消失了。
1 回答
holdtom
TA貢獻1805條經驗 獲得超10個贊
預期:Spring 存儲庫測試是事務性的,并且默認情況下在每個測試結束時回滾事務。
即使您選擇不回滾,每個測試都應該獨立于其他測試,并且應該能夠單獨運行。您也不應該依賴執行順序。findUserByIdTest()如果removeUserTest()先運行,您將失敗。
因此,首先要清理數據庫并在每次測試之前插入測試數據。如果每次測試后都讓 Spring 回滾,則不需要清理,但仍應在每次測試前插入測試數據。
遞增 ID 應該不是問題:您只需要在測試的字段中將創建的實體或它們的 ID 攪動,并在測試中引用這些實體及其 ID,而不是使用硬編碼的 ID。
添加回答
舉報
0/150
提交
取消
