![](/img/trans.png)
[英]Spring integration jpa repository tests don't work as it should
[英]Spring Data JPA database changes after each method don't roll back in integration tests
I am using JUnit 5 with Spring boot 2.2.4 for integration testing my Spring Boot application code with MySQL 5.7 database but the changes that a previous test method makes to database aren't rolled back causing errors in the ones that follow.
我嘗試了來自不同 stackoverflow 帖子的答案,例如添加@Transactional
(來自 Spring)、@Rollback(方法以及@Rollback
級別)、 @TestExecutionListeners(listeners = {TransactionalTestExecutionListener.class})
。 我已經單獨(以及組合)測試了這些選項,但將它們一起添加到測試代碼中。
這是我的測試代碼:
@DataJpaTest
@Transactional
@Rollback
@ExtendWith(SpringExtension.class)
@Import({UserUsecasesImpl.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserUsecasesImplINTTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
@Spy
private UserRepository userRepository;
@Autowired
private UserUsecases userUsecases;
@Test
void injectedComponentsAreNotNull(){
assertNotNull(entityManager);
assertNotNull(userRepository);
assertNotNull(userUsecases);
}
@Test
@Rollback
void Create_EntityAlreadyExists_ReturnsException() {
// set up
User expected = UserFixture.user1.toBuilder().build();
// entityManager.persistAndFlush(expected);
userRepository.saveAndFlush(expected);
// execute
User actual = userUsecases.create(expected);
// verify
assertEquals(expected, actual);
verify(userRepository).findOne(any(Example.class));
verify(userRepository, never()).save(any(User.class));
verifyNoMoreInteractions();
}
@Test
void Find_WhenUserPresent_ReturnUser() {
// // set up
User expected = UserFixture.user1.toBuilder().build();
entityManager.persistAndFlush(expected);
// execute
User actual = userRepository.find(expected);
// verify
assertEquals(expected, actual);
}
@Test
// @Transactional
void Find_WhenUserNotPresent_ReturnNull() {
// // set up
User expected = UserFixture.user1.toBuilder().build();
// entityManager.persistAndFlush(UserFixture.user2.toBuilder().build());
// execute
User actual = userUsecases.find(expected);
// verify
assertNull(actual);
}
}
UserUsecasesImpl
是我正在嘗試測試的 class ,它包含創建用戶、查找用戶、獲取所有用戶等用例。代碼中的其他任何地方都沒有特殊配置。
請實施以下修復,如果問題仍然存在,請告訴我:
@Transactional
和@Rollback
。 保留@DataJpaTest
,默認情況下使您的所有測試 @Transactional ,因此默認情況下會將它們全部回滾。saveAndFlush
。 刷新部分是將保存操作刷新到數據庫中,很可能會導致您的問題。 改用save
。 更多在這里https://www.baeldung.com/spring-data-jpa-save-saveandflushassertThrows
對其進行斷言。一般來說,盡量不要同時將你知道的每一個注釋都扔到混合中。 根據需要一次添加一個,嘗試了解它們的作用。
什么是 UserUseCases,為什么它會執行我希望存儲庫 class 執行的大部分邏輯?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.