@SpringBootTest
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
@AfterEach
void afterEach() {
//MemoryItemRepository 의 경우 제한적으로 사용
if (itemRepository instanceof MemoryItemRepository) {
((MemoryItemRepository) itemRepository).clearStore();
}
}
@Test
void save() {
//given
Item item = new Item("itemA", 10000, 10);
//when
Item savedItem = itemRepository.save(item);
//then
Item findItem = itemRepository.findById(item.getId()).get();
assertThat(findItem).isEqualTo(savedItem);
}
@Test
void updateItem() {
//given
Item item = new Item("item1", 10000, 10);
Item savedItem = itemRepository.save(item);
Long itemId = savedItem.getId();
//when
ItemUpdateDto updateParam = new ItemUpdateDto("item2", 20000, 30);
itemRepository.update(itemId, updateParam);
//then
Item findItem = itemRepository.findById(itemId).get();
assertThat(findItem.getItemName()).isEqualTo(updateParam.getItemName());
assertThat(findItem.getPrice()).isEqualTo(updateParam.getPrice());
assertThat(findItem.getQuantity()).isEqualTo(updateParam.getQuantity());
}
@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);
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);
}
}
메모리 리포지토리일 경우 테스트 후 리포지토리를 클리어 해 준다. 그리고 clearStore가 Repository 인터페이스에는 없기 때문에 구현체를 바라본다. 하긴 오로지 테스트를 위해 만든 함수라..
save()는 먼저 저장을 해보고, 다시 리포지토리에서 id로 찾아와서 똑같은 건지 확인을 한다.(원래 equels는 같은 객체가 아니기에 다른 값이 나와야 하지만, 도메인에 @Data를 썼기 때문에, 이거 하면은 equels를 오버라이드 해줘 각 필드의 값이 모두 같으면 true로 된다.)
update()는 먼저 아이템을 하나 생성하고 넣어준다.
그 다음 그세이브 된 것의 id를 가져온다(리포지토리에서 save() 할 때에 그 Item을 반환하도록 해놨다.)
그 다음 update용으로 만든 ItemUpdateDto를 만들고, 어떤 값으로 업데이트 하고 싶은지 넣어준다.
그 다음, update()에 어떤것을 update할지 id를 주고, 업데이트 할 값을 준다(ItemUpdateDto)
그 다음 id로 다시 찾아봐서,
제대로 ItemUpdateDto에 넣은 값들이 반영되었는지, 같은지 확인한다.
아이템 여러개 생성해 본다.
그 다음 다 save()한다.
우리가 findAll 할 때 ItemSearchCond를 넣기로 했는데,
이거는 itemName, maxPrice를 필드로 가지고 있는 클래스로,
위 조건으로 아이템을 찾는거다.
void test(String itemName, Integer maxPrice, Item... items) {
List<Item> result = itemRepository.findAll(new ItemSearchCond(itemName, maxPrice));
assertThat(result).containsExactly(items);
}
이거 보면 repository의 findAll을 이용한다.
findAll은 결과값으로 Item의 리스트를 반환한다.
Item... items 이거는
가변인자라고 하는데 저렇게 하면 배열로 넣어진다. 쓸려면 맨 끝에 해야 하고, 여러 개 넣을 수 있다.
타입명... 쓸배열이름
해서
이걸 호출한 위에 test()를 보면
null, null을 조건으로 호출해서 다 true가 나와서 모두 반환이 된다.
그래서 가변인자로 준 item1~3이 다 나와서 test()의 result에 다 들어가게 되고,
그 result와 가변인자로 준 items들이 같아야 한다. (포함하고 있어야 한다.)
containsExactly는 순서까지 완전히 일치해야 한다는 거다.
containsOnly는 순서, 중복을 무시하는 대신 원소값과 갯수가 정확히 일치해야 한다.
itemA로 find하면 itemA가 들어간 item1, item2만 나와야 하고,
최대 금액을 10000으로 테스트 하면 item1만 나와야 한다.
'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글
6. Jdbc 템플릿 (0) | 2023.10.08 |
---|---|
5. DB생성 (0) | 2023.10.08 |
3. 간이 프로젝트의 설정부 (0) | 2023.10.07 |
2. 학습을 위한 간이 프로젝트 (0) | 2023.10.07 |
1. 데이터 접근 기술들 (0) | 2023.10.07 |