본문 바로가기

Java/Spring

[Spring] 길찾기 서비스 #5

What to do?

테스트 코드 작성하기


application.yaml

 

test/resources/application.yaml

# properties for test
spring:
  datasource:
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
    url: jdbc:tc:mariadb:10:///
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

kakao:
  api:
    base-url: "https://dapi.kakao.com/v2/local/search/address.json"
    secret-key: ${KAKAO_API_SECRET_KEY}

 

Edit Configuration 메뉴를 통해서 카카오 키도 넣어주자.


AbstractIntegrationBaseTest

 

  • 테스트 코드에서 Specification 대신 AbstractIntegrationBaseTest를 상속받아서 작성
@SpringBootTest
abstract class AbstractIntegrationBaseTest extends Specification {
    static final GenericContainer MY_REDIS_CONTAINER;
    static {
        /**
         * Container
         * name : redis
         * version : 6
         * port : 6379
         */
        MY_REDIS_CONTAINER = new GenericContainer<>("redis:6")
                .withExposedPorts(6379)
        MY_REDIS_CONTAINER.start();
        System.setProperty("spring.redis.host", MY_REDIS_CONTAINER.getHost());
        System.setProperty("spring.redis.port", MY_REDIS_CONTAINER.getMappedPort(6379).toString());
    }
}

KakaoApiServiceTest

 

  • kakao api service 코드 테스트
    • buildUri
      • 한글주소를 인코딩하고, 디코딩한 결과가 원래 값과 일치하는지 확인
    • searchAddress - if address is null, then return nul
      • 한글 주소에 null값을 입력하면 null을 return하는지 확인
    • searchAddress - if address is valid, then return dto
      • 유효한 한글주소를 입력했을 때, 카카오 API 요청결과가 제대로 된 값이 오는지 확인
class KakaoApiServiceTest extends AbstractIntegrationBaseTest {

    @Autowired private KakaoApiService kakaoService

    def "buildUri"() {
        given:
            String 한글주소 = "서울 상도동"
            def charset = StandardCharsets.UTF_8

        when:
            def uri = kakaoService.buildUri(한글주소)
            def 인코딩 = uri.toString()
            def 디코딩 = URLDecoder.decode(인코딩, charset)

        then:
            디코딩 ==  "https://dapi.kakao.com/v2/local/search/address.json?query=" + 한글주소
    }

    def "searchAddress - if address is null, then return null"(){
        given:
        String 한글주소 = null
        when:
            KakaoApiResponseDto 검색결과 = kakaoService.searchAddress(한글주소)
        then:
            검색결과 == null
    }

    def "searchAddress - if address is valid, then return dto"(){
        given:
            String 한글주소 = "서울 동작구 상도동"
        when:
            KakaoApiResponseDto 검색결과 = kakaoService.searchAddress(한글주소)
        then:
            검색결과.documents.size()>0
            검색결과.meta.totalCount>0
    }
}


StoreEntityRepositoryTest

 

  • StoreEntity
    • 이전 포스팅에서 작성한 코드 일부 수정
@Entity(name="store")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StoreEntity {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
    private String name;
    @Column(nullable = false) private String address;
    @Column(nullable = false) private Double latitude;
    @Column(nullable = false) private Double longitude;
    private StoreEntity(String name, String address, Double latitude, Double longitude) {
        this.name = name;
        this.address = address;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public static StoreEntity of(String name, String address, Double latitude, Double longitude){
        return new StoreEntity(name, address, latitude, longitude);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        StoreEntity that = (StoreEntity) o;
        return id.equals(that.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

 

  • StoreEntityRepository
@Repository
public interface StoreEntityRepository extends JpaRepository<StoreEntity, Long> {
}

 

  • StoreEntityRepositoryTest
    • Save Entity, Check Fields
      • StoreEntity 저장 후, 저장된 내용 확인
    • Save Entity, Check Count
      • StoreEntity 저장 후, findAll로 개수가 1개 늘어났는지 확인
class StoreEntityRepositoryTest extends AbstractIntegrationBaseTest {
    @Autowired StoreEntityRepository storeEntityRepository;

    def setup(){
        storeEntityRepository.deleteAll();
    }

    def "Save Entity, Check Fields"(){
        given:
            String address = "서울특별시 동작구 상도동"
            String name = "할리스커피"
            Double latitude = 12
            Double longitude = 12
            def store = StoreEntity.of(name, address, latitude, longitude);

        when:
            def saved = storeEntityRepository.save(store)

        then:
            saved.getAddress() == store.getAddress()
            saved.getName() == store.getName()
            saved.getLatitude() == store.getLatitude()
            saved.getLongitude() == store.getLongitude()
    }

    def "Save Entity, Check Count"(){
        given:
            String address = "서울특별시 동작구 상도동"
            String name = "할리스커피"
            Double latitude = 12
            Double longitude = 12
            def store = StoreEntity.of(name, address, latitude, longitude);

        when:
            def cntBeforeSave = storeEntityRepository.findAll().size();
            def saved = storeEntityRepository.saveAll(Arrays.asList(store))
            def cntAfterSave = storeEntityRepository.findAll().size();

        then:
            cntAfterSave == cntBeforeSave+1
    }
}

 

'Java > Spring' 카테고리의 다른 글

[Spring] 간단한 SNS 만들기 #1  (0) 2022.12.22
[Spring] 길찾기 서비스 #6  (0) 2022.12.11
[Spring] 게시판 만들기 #12  (0) 2022.11.26
[Spring] 게시판 만들기 #11  (0) 2022.11.24
[Spring] 게시판 만들기 #10  (0) 2022.11.23