본문 바로가기

TIL

<트러블 슈팅> 자바 JUnit 테스트 에러

- 에러 발생

자바에서 JUnit 테스트를 하던 중 에러가 발생했다.

회원가입 기능 구현을 위해 관련 클래스명들을 Member로 설정하고 뒤에는 각각 해당되는 역할로 네이밍을 하여 클래스 생성 및 코드 작성을 완료한 상태였다.

 

 

- 에러 내용

이 중, DB와 연결하여 관련 기능을 수행하는 Repository의 경우 MemberRepository로 이름짓고, 코드는 아래와 같이 작성하였다.

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberRepository {
	
	//회원가입
	public int setInsert(MemberVO memberVO) throws Exception;

}

보시다시피 setInsert 메서드가 잘 구현되어 있다. 여기까지 그 어떤 에러도 없었다.

 

그리고 DB와의 연동으로 잘 작동하는지 확인을 위해, 테스트를 시행했던 것이며 코드는 아래와 같았다.

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class MemberRepository{
	
	@Autowired
	private MemberRepository memberRepository;
	
	@Test
	void setInsertTest() throws Exception {
		MemberVO memberVO = new MemberVO();
		memberVO.setId("user");
		memberVO.setPw("user");
		memberVO.setName("user");
		memberVO.setEmail("user@email.com");
		
		int result = memberRepository.setInsert(memberVO);
		
		assertEquals(1, result);
	}

}

그런데 위의 코드에서 마지막 부분의 setInsert 메서드 부분에서 자꾸 빨간색 줄이 그어져있고, 없어지질 않았다. 결국 실행시켜보니 역시나 테스트가 제대로 실행되지 않았고, 'setInsert not found' 에러가 나타났다. 그래서 아래 사항들을 다시 점검해보았다.

1. 오타가 없는지 -> 오타 없었다.

2. MemberRepository의 setInsert 메서드명과 다른 것인지 -> 완벽하게 같았다.

3. 혹시 try~catch 구문이 필요한 것인가?(엥?) -> 이건 아니었다.

4. 매개변수를 잘못 넣었나? -> 그럴리가 없다. 테스트 메서드 안에 객체 생성 잘 해두었다.

5. setInsert 메서드를 담고 있는 테스트 메서드 어딘가에 잘못된 오타가 있는가? -> 오타도 없고, 나머지 모두 제대로 짜여있다.

 

 

- 에러 원인

수업으로 진행되던터라, 혼자 위 사항을 모두 점검하였음에도 해결책을 찾기가 어려워 결국 강사님께 여쭤보았고, 강사님도 함께 에러의 원인을 찾아보시던 중 결국 원인은 MemberRepository가 잘못된 클래스로 import 되어있었던 것으로 확인이 되었다.

 

즉, src/main에 있는 MemberRepository 클래스가 임포트 된 것이 아니라, JUnit 테스트 클래스의 네임도 MemberRepository로 되어있어 서로 구분이 안되어있었고, 그래서 나도 모르게 후자의 클래스도 임포트를 한 것이었다. 그래서 테스트 클래스에 테스트 클래스를 임포트하고 메서드를 작성한 셈(...)이었다.

 

 

- 에러 해결

그래서 강사님의 조언대로, 테스트 클래스의 네임을 MemberRepositoryTest로 변경하고, 임포트는 src/main에 있는 클래스로 다시 수정하였더니 그제야 정상적으로 작동했다.

 

 

- 배운점

이번 에러를 해결하고 확 체감했던 것은, 아, 에러의 원인을 찾을 때는 해당 에러가 발생한 코드가 어떻게 만들어졌는지 생각하면서 그 단계를 거꾸로 차근차근 다시 확인해보는 것이 좋은 방법이 될 수 있겠구나. 했던 거였다. 그래서 이번 케이스의 경우는, setInsert 메서드가 현재 속해있는 JUnit 클래스 내부를 먼저 살펴보는데, setInsert 메서드 실행을 위해 꼭 필요한 MemberRepository 클래스가 제대로 선언되어있는지 보고, 다시 작성해보았다면 보다 쉽게 원인을 찾아낼 수 있지 않았을까 했던 문제였다. 그동안 많은 에러를 고치며 성장했지만, 이번 경우는 강하게 느낀 바가 있어 글로 꼭 남겨놓고 싶었다.

'TIL' 카테고리의 다른 글

<자바 Java> 메서드  (0) 2021.11.07
<자바 Java> DB 연동하기 (2)  (0) 2021.11.06
<자바 Java> 생성자  (0) 2021.11.04
<자바 Java> 서블릿(Servlet) 개발 환경 설정  (0) 2021.11.03
<자바 Java> I/O 스트림과 서블릿  (0) 2021.11.02