spring 如何在Testcontainers中重置自动增量MySQL集成测试

dm7nw8vv  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(124)

我使用Testcontainers在MySQL容器中运行集成测试。我有一个实体Listing,它有一个到子实体Variations的OneToManyMap。我在服务层中有一个方法,它更新关联列表的变体(注意,它会事先删除所有现有变体):

public ListingDTO updateListingVariations(String listingId, List<ListingVariationDTO> variations) {
    listingVariationRepository.deleteAllByListingId(listingId);

    return listingRepository.findByListingId(listingId)
            .map(listing -> {
                List<ListingVariation> newVariations = variations.stream()
                        .map(this::toListingVariation)
                        .toList();
                listing.setVariations(newVariations);
                return this.toListingDTO(listingRepository.save(listing));
            })
            .orElseThrow(() -> new ListingNotFoundException(listingId));
}

现在我对这个方法进行一个测试(假设数据库已经包含一个Listing和一些关联的ListingVariation):

@Test
void shouldUpdateListingVariationsIfListingIdExists() {
    // builders for ListingVariation objects

    assertThat(listingService.findByListingId(validListingId).getVariations())
            .isEqualTo(listingVariations);
    assertThat(listingService.updateListingVariations(validListingId, newVariations).getVariations())
            .isEqualTo(newVariations);
}

但是,测试失败,出现以下错误:

expected: [ListingVariationDTO{id=1, listingId='listingId', ...}]
 but was: [ListingVariationDTO{id=4, listingId='listingId', ...}]

我意识到这是因为当以前的变化记录被删除时,表上的自动增量没有重置。我可以修改我的测试来构建一个新的ListingVariation对象,并将ID硬编码为4,但为了测试代码的简单性,我想避免这样做。我可以通过MySQL容器重置表上的自动增量吗?

ijxebb2r

ijxebb2r1#

您可以通过executing a SQL statement执行此操作。

ALTER TABLE tablename AUTO_INCREMENT = 1

您可能会使用JdbcTemplate来执行此操作。
但是我认为你不应该在测试中检查id的值,只要检查id不是null就行了,这是正确的方法,因为(希望如此)没有人关心id,它只是一个id,不管它是1、2、4还是314159265,所以你的测试也不应该关心。

相关问题