작성
·
25
·
수정됨
0
강의 4:33 의 코드입니다.
@Test
void findItems() {
//given
Item item1 = new Item("itemA-1", 10000, 10);
Item item2 = new Item("itemA-2", 20000, 20);
Item item3 = new Item("itemB-1", 30000, 30);
log.info("repository={}", itemRepository.getClass());
itemRepository.save(item1);
itemRepository.save(item2);
itemRepository.save(item3);
//둘 다 없음 검증
test(null, null, item1, item2, item3);
test("", null, item1, item2, item3);
//itemName 검증
test("itemA", null, item1, item2);
test("temA", null, item1, item2);
test("itemB", null, item3);
//maxPrice 검증
test(null, 10000, item1);
//둘 다 있음 검증
test("itemA", 10000, item1);
}
void test(String itemName, Integer maxPrice, Item... items) {
List<Item> result = itemRepository.findAll(new ItemSearchCond(itemName, maxPrice));
assertThat(result).containsExactly(items);
}
MemoryRepository의 HashMap은 순서를 보장하지 않는데, 강의에서 실습을 할 때는
itemRepository.save(itemOO) 순으로 넣은대로 List로 변환되는것 같습니다.
test(null, null, item1, item2, item3);
이 테스트는 매번 일관되게 나와야하는데 항상 item1, item2, item3 순으로 잘 통과되는 이유가 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 창신동 장첸님.
질문하신 내용에 따르면, HashMap을 사용한 MemoryRepository에서는 일반적으로 순서가 보장되지 않기 때문에 기대하는 순서대로 List로 변환되지 않을 수 있습니다. 그러나 테스트가 항상 item1, item2, item3 순서로 통과되는 이유는 다음과 같은 몇 가지 가능성이 있을 수 있습니다.
테스트 환경과 데이터의 크기: 작은 데이터 셋과 특정 환경에서는 우연히 순서가 항상 일정하게 보이는 경우가 있습니다. 하지만 이는 일반적인 HashMap의 동작 특성이 아니라, 데이터의 크기나 자바의 내부 구현 등에 의한 특정 상황에서의 현상일 가능성이 큽니다. HashMap은 자바의 내부 구조에 따라 순서가 달라질 수 있습니다.
동일한 해시 값: 저장된 객체의 해시 코드가 모두 다르면, 입력된 순서대로 나열될 가능성이 있습니다. 하지만 이 역시 일반적인 보장은 아니며, 항상 주의해야 하는 부분입니다.
테스트 코드의 구현 방식: findAll
메서드나 그 이후의 로직에서 정렬을 한 뒤에 결과를 반환하고 있을 가능성도 있습니다. 저장된 데이터를 반영하는 List로 변환하는 과정에서의 정렬 여부를 확인해 보세요.
답변 참고:
- “HashMap을 사용한 MemoryItemRepository에서 순서 보장 문제와 테스트 실패 가능성 질문”
- “hashMap 저장순서”
위 두 개의 게시물에서 순서 보장 문제에 대한 더 자세한 설명을 찾아볼 수 있습니다. 순서가 보장되지 않는 경우에 대비하여 항상 테스트가 제대로 작동하고 있는지 확인하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.