맨 처음 작성할 테스트 코드는 리포지터리[^1] 테스트 코드이다. 처음 작성하는 테스트 코드인 만큼 다른 테스트와 공용으로 쓸 `assertor`도 같이 작성한다. **테스트 코드를 모두 작성하면, `PromptTemplate` 엔티티와 `PromptTemplateRepository` 리포지터리를 작성하고 테스트를 진행할 것이다.** ## `assertor` 작성 ### `SingleArgAssertor` ```java @FunctionalInterface public interface SingleArgAssertor<T> { void assertify(T t); } ``` ### `DoubleArgAssertor` ```java @FunctionalInterface public interface DoubleArgAssertor<T, G> { void assertify(T t, G g); } ``` ## `config` 작성 ### `PromptTemplateTestConfig` ```java @TestConfiguration public class PromptTemplateTestConfig { @Bean public DoubleArgAssertor<PromptTemplate, PromptTemplate> equalityAssertor(){ return (template1, template2) -> { assertEquals(template1.getId(), template2.getId()); assertEquals(template1.getContent(), template2.getContent()); }; } @Bean public SingleArgAssertor<PromptTemplate> notNullAssertor(){ return (template) -> { assertNotNull(template.getId()); assertNotNull(template.getContent()); assertNotNull(template.getModifiedDate()); }; } } ``` ## `PromptTemplateRepositoryTest` 작성 ### 클래스 생성 ```java @DataJpaTest @TestPropertySource(locations = "classpath:test.properties") @Import(PromptTemplateTestConfig.class) class PromptTemplateRepository { } ``` - `@TestPropertySource`를 통해 `test.properties`로 설정을 읽어오도록 한다. - `@Import`는 여러 자바 설정 클래스를 하나로 병합하는 어노테이션이다. 여기서는 `@ComponentScan`처럼 설정 클래스인 `PromptTemplateTestConfig`를 불러오는 용도로 사용한다. ### 의존성 주입 ```java @DataJpaTest @TestPropertySource(locations = "classpath:test.properties") @Import(PromptTemplateTestConfig.class) class PromptTemplateRepository { @Autowired private PromptTemplateRepository repository; @Autowired private SingleArgAssertor<PromptTemplate> notNullAssertor; @Autowired private DoubleArgAssertor<PromptTemplate, PromptTemplate> equalityAssertor; } ``` - 아직 `PromptTemplateRepository` 인터페이스와 `PromptTemplate` 클래스를 만들지 않았기 때문에 당연히 컴파일 오류가 날 것이다. ### 메서드 작성 #### `repository` 주입 됐는지 확인 ```java @Test public void testRepositoryNotNull(){ assertNotNull(promptTemplateRepository); } ``` #### save 확인 ```java @Test public void testSave(){ //Given PromptTemplate promptTemplate = PromptTemplate.builder() .id("test_instance") .content("Say ${word} twice!") .modifiedTime(LocalDateTime.now()) .build(); //When final PromptTemplate savedTemplate = repository.save(promptTemplate); //Then notNullAssertor.assertify(savedTemplate); equalityAssertor.assertify(promptTemplate, savedTemplate); } ``` #### findById 확인 ```java @Test public void testFindById(){ //Given PromptTemplate promptTemplate = PromptTemplate.builder() .id("test_instance2") .content("What is ${word}?") .build(); //When final PromptTemplate findedTemplate = repository.save(promptTemplate); //Then equalityAssertor.assertify(promptTemplate, findedTemplate); assertTrue(repository.findById("I am really Id. Trust me!").isEmpty()); } ``` #### deleteById 확인 ```java @Test public void testDeleteById(){ //Given PromptTemplate promptTemplate = PromptTemplate.builder() .id("test_instance2") .content("What is ${word}?") .build(); //When repository.save(promptTemplate); repository.deleteById(promptTemplate.getId()); //Then assertTrue(repository.findById("test_instance2").isEmpty()); } ``` ## [[5. Spring Boot JPA를 통한 Entity & Repository 구현|엔티티 & 리포지터리 코드 작성]] ![[5. Spring Boot JPA를 통한 Entity & Repository 구현#PromptTemplate Entity]] ![[5. Spring Boot JPA를 통한 Entity & Repository 구현#PromptTemplateRepository]] ## 테스트 결과 확인 ![[Pasted image 20231213122435.png]] [^1]:repository를 한국어로 어떻게 표기하는지 참 난감하다. 일단 [위키피디아](https://ko.wikipedia.org/wiki/%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%84%B0%EB%A6%AC) 기준으로 작성하였다.