Spring Boot + MyBatis + MySQL 테스트 코드 작성 시 설정

nayu1105·2023년 7월 28일
1

이전에 Spring Boot + MyBatis + MySQL 를 사용하여 진행했던 프로젝트를 리팩하기 위해 기존의 API가 잘 작동되는 테스트 코드를 작성 후 이 테스트 코드를 바탕으로 서비스르 개편하기로 했다.

1. 설정

먼저 테스트 코드 작성 전 환경설정을 위해 Gradle 에 다음 구문을 추가 하였다.

	//test
	// multiple occurrences 문제로 exclude 설정
	testImplementation("org.springframework.boot:spring-boot-starter-test"){
		exclude group: "com.vaadin.external.google", module:"android-json"
	}

	//junit
	testImplementation 'junit:junit:4.13.1'


	//lombock
	testCompileOnly 'org.projectlombok:lombok:1.18.12' // 테스트 의존성 추가
	testAnnotationProcessor 'org.projectlombok:lombok:1.18.12' // 테스트 의존성 추가

<설정 시 마주했던 오류>

1. Multiple Occureences

참고한 사이트

참고로 나는 Gradle Spring Boot를 빌드 했다.

기존에 Grdale 은 다음과 같았다.

이를 빌드할 시 'Found multiple occurrences of org.json.JSONObject on the class path:' 라고 오류가 났다. 구글링해서 찾아본 결과 테스트를 돌릴 때 'android-json/...'은 필요없다 하여 경로를 제거해주는 구문을 Gradle에 추가하였다.

  • 기존
	testImplementation("org.springframework.boot:spring-boot-starter-test")
  • 변경 후
	testImplementation("org.springframework.boot:spring-boot-starter-test"){
		exclude group: "com.vaadin.external.google", module:"android-json"
	}

2. @Mybatis 안됨

참고한 사이트

테스트 코드 작성시

다음과 같이 @SpringBootTest이 기본으로 되어있지만 MyBatis 공식문서를 보고 @MyBatis를 쓰면 자동으로 @Mapper 등록을 해놓은 빈들이 주입 된다고 확인하여
@MyBatis를 사용했더니 @Autowried가 오류가 났다!!!!!

해결방법은 아래와 같다.


@Mybatis는 Only Mapper만 사용할 때 된다고 하여 @SpringBootTest로 고친 후 @Autowired를 붙여 모든 생성해놓은 빈들이 자동 주입되도록 하였다.

처음부터 세팅해준대로 쓸 걸 제대로 삽질했다 ㅎㅎ

3. Datasource 경로 찾지 못함

참고한 사이트

분명히 main 코드 실행을 하면 잘 빌드 되고 api 됨을 확인했는데 test 코드 빌드 시 Datasource를 못찾았다고 오류가 났다.

해결방법은 아래와 같다.

main 과 test는 resources 도 따로 잡아야한다..!!!! application.properties 설정 하니 오류가 사라졌다.

이거 때문에 한시간 이상 DB 에러인가 미친듯이 확인했는데 너무 쉽게 해결돼서 어이없었다. 이러면서 배우는 거겠지... 다신 이런 실수 하지 말자!

4. Initiallizer Error

참고한 사이트

이제 진짜 진짜 마무리 라고 생각하고 빌드를 돌렸는데

이렇게 떴다.

테스트 코드는 정상 작동하는데 자꾸 InitializationError 가 떴다.

해결방법은 다음과 같다.

  • 기존

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(replace = Replace.NONE)
  • 변경후

@SpringBootTest
@AutoConfigureTestDatabase(replace = Replace.NONE)

@RunWith(SpringRunner.class) 어노테이션 때문이였다. 지우니까 깔끔하게 해결되었다.

1개의 댓글

comment-user-thumbnail
2023년 7월 28일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기