簡體   English   中英

Spring 數據 JPA 每種方法后數據庫更改不會在集成測試中回滾

[英]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 ,它包含創建用戶、查找用戶、獲取所有用戶等用例。代碼中的其他任何地方都沒有特殊配置。

請實施以下修復,如果問題仍然存在,請告訴我:

  1. 刪除所有@Transactional@Rollback 保留@DataJpaTest ,默認情況下使您的所有測試 @Transactional ,因此默認情況下會將它們全部回滾。
  2. 不要使用saveAndFlush 刷新部分是將保存操作刷新到數據庫中,很可能會導致您的問題。 改用save 更多在這里https://www.baeldung.com/spring-data-jpa-save-saveandflush
  3. 如果您期待異常,請使用assertThrows對其進行斷言。

一般來說,盡量不要同時將你知道的每一個注釋都扔到混合中。 根據需要一次添加一個,嘗試了解它們的作用。

什么是 UserUseCases,為什么它會執行我希望存儲庫 class 執行的大部分邏輯?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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