Cześć, mam pytanie odnośnie inicjalizacji danych testowych (testy integracyjne) i czyszczenie bazy danych pomiędzy testami. Migracje tabel robię przez flyway, baza na dockerze, mam jeden testcontainer dla wszystkich testów. Początkowo migracje zawierały dane inicjalizacyjne dla testów, testy się wykrzacały ze względu na jeden kontener. Obecnie robię to przez @sql adnotację. Czy takie podejście jest poprawne (zdaję sobie sprawę z ograniczeń - zmiany w tabelach i będę musiał pamiętać o zmianie sql). Czy nie lepiej rozbić to na osobne kontenery (odpalanie ich trwa...)? @Transactional nad testem/klasą z tego co rozumiem powoduje rollback przed zapisem. Prośba o radę jakie podejście jest najbardziej optymalne.
@Sql(scripts = {"/db/clean_user.sql", "/db/user_data.sql"},
executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@SpringBootTest
@ActiveProfiles("test")
@AllArgsConstructor(onConstructor_ = @Autowired)
class AccountUserServiceIntegrationTest extends TestContainerConfig {
private AccountUserService accountUserService;
private UserService userService;
private AddressService addressService;
private LibrarianService librarianService;
private PasswordEncoder passwordEncoder;
@Test
void shouldCreateNewUser_WhenUserDoesNotExist() {
// phone number is empty because it is optional
// membershipDate is empty because it is set during newUser creation
// given
long initialUserCount = userService.countUser();
User newUser = DomainDataFactory.userForNewAccount();
assertThat(userService.findUserByEmail(newUser.getEmail())).isEmpty();
// when
User savedUser = accountUserService.createAccountUser(newUser);
// then
long updatedUserCount = userService.countUser();
assertThat(updatedUserCount).isEqualTo(initialUserCount + 1);
assertThat(savedUser.getUserId()).isNotNull();
assertThat(savedUser.getAddress().getAddressId()).isNotNull();
assertThat(savedUser.getMembershipDate()).isNotNull();
assertThat(savedUser).usingRecursiveComparison()
.ignoringFields("userId", "password", "membershipDate", "address.addressId", "address.users")
.isEqualTo(newUser);
assertThat(passwordEncoder.matches(newUser.getPassword(), savedUser.getPassword())).isTrue();
}
}