맨 처음 작성할 테스트 코드는 리포지터리[^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) 기준으로 작성하였다.