我使用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容器重置表上的自动增量吗?
1条答案
按热度按时间ijxebb2r1#
您可以通过executing a SQL statement执行此操作。
您可能会使用
JdbcTemplate
来执行此操作。但是我认为你不应该在测试中检查id的值,只要检查id不是
null
就行了,这是正确的方法,因为(希望如此)没有人关心id,它只是一个id,不管它是1、2、4还是314159265,所以你的测试也不应该关心。