스프링/6. 스프링 DB-2

12. DB 접근 기술 테스트 하는 법

sdafdq 2023. 10. 9. 00:27

이제 DB 기술을 직접 서비스 하기 전에 CRUD 등 테스트 해보는 게 필요하니,

 

테스트 할 때마다 직접 서버를 띄워서 하기보다는, 따로 테스트를 편리하게 만드는 게 좋음.

 

 

테스트에

@SpringBootTest

이 애노테이션이 붙어 있으면,

 

상위의

@Import(JdbcTemplateV3Config.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(ItemServiceApplication.class, args);
	}

	@Bean
	@Profile("local")
	public TestDataInit testDataInit(ItemRepository itemRepository) {
		return new TestDataInit(itemRepository);
	}
}

저 @SpringBootApplictation 붙어 있는 걸 찾아서 실행한다.

 

 

 

@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);
    }
}

테스트 코드.

뭐 저번이랑 같음.

 

근데 이거는 아무래도 특히 findItems 이거 db에 아무것도 없는 상태라고 가정했을 때 테스트 하는거임.

 

근데 우리는 이미 이것저것 해 보면서 DB에 쌓였음.

 

그래서 test()의 assertThat().containsExcatly 저거는 값과 순서도 같아야 하는거라,

이미 db쪽에 쌓여진 데이터가 있어서 앞쪽의 순서는 그것들임..

 

 

중요한 게, 테스트는 격리된 환경에서 해야 함.

 

이제 따로 TEST용 DB테이블을 만들거임.

'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글

14. 데이터 롤백  (0) 2023.10.09
13. 테스트용 DB와 서버용 DB 분리  (0) 2023.10.09
11. JDBC 기능들  (0) 2023.10.08
10. 이름지정 파라미터2  (0) 2023.10.08
9. 이름지정 파라미터  (0) 2023.10.08