인프런 커뮤니티 질문&답변

유진이님의 프로필 이미지
유진이

작성한 질문수

스프링 핵심 원리 - 기본편

관심사의 분리

MemberServiceTest 질문 있습니다.

작성

·

189

1

안녕하세요.

JUnit을 통해 MemberServiceTest 작성할때

질문있습니다.

강의에서는 이와 같이 @BeforeEach를  사용해 

test 전에 AppConfig 인스턴스를 생성하고 메소드를

활용해 memberService 객체를 만들어줍니다. 

하지만 TestCode가 아닌 main method가 있는 

클래스에서 테스트 할때는 그냥 AppConfig를 객체로

생성해서 사용하죠.

 

여기서 궁금증 있습니다.

왜 TestCode에서 

이렇게 쓰면 안되는 것이고, 오류가 나는 것인지 궁금합니다.

 

추가적으로 BeforeEach에 대해 개발자님께서 테스트

실행전에 무조건 실행하는 것이라고 말씀해주셨습니다.

 

그렇다면 MemberService memberSevice; 라는

코드는 BeforeEach 밖에 존재하기 때문에 이상합니다.

왜냐하면 테스트 전에 AfterEach가 실행된다면

이때, BeforeEach 안의 

memberService = appConfig.memberService

이 코드가 memberService를 선언한 적이 없어서

오류가 발생해야 한다고 생각이 들었습니다. 

하지만 잘 실행되는 이유가 궁금합니다. 

제 생각에는 테스트 전에 실행되는 것이니 

MemberService memberService;

memberService = appConfig.memberService

이런식으로 BeforeEach에 들어가 있어야만

된다고 생각이 들었습니다.

 

1. 왜 BeforeEach를 사용해야지만 appConfig

객체의 메소드로 memberService를 넣어줄 수

있고, 저 Test code가 정상 작동하는지 ?

 

2. BeforeEach는 테스트 전에 무조건 실행

되는데 어떻게 MemberService 클래스 변수의

선언이 BeforeEach에 밖에 존재하는지 ?

 

두가지입니다. 감사합니다.

답변 1

0

안녕하세요. 유진이님, 공식 서포터즈 David입니다.

1. 멤버변수 선언부에서는 선언, 선언과 동시에 초기화하는 것 이외에는 문법적으로 허용되지 않습니다.

자바 기본 문법이오니 참고해주세요.

https://docs.oracle.com/javase/tutorial/java/javaOO/variables.html

 

2. BeforeEach가 붙은 메서드는 각 테스트 메서드 실행 전에 실행됩니다. 따라서 멤버 변수로 선언된 memberService에 값을 할당할 수 있습니다.

감사합니다.

 

 

유진이님의 프로필 이미지
유진이
질문자

답변 감사드립니다. 일단 보내주신 링크 들어가서 봤는데, 해당 내용은 안보이네요. 개인적으로 자바 기본 문법을 좀 공부해야할 것 같습니다. 강의를 들으며 의문 사항을 질문하다 보면 이론으로는 알았다고 생각했는데, 사용하지 않아보니 명확한 의미가 정립되어 있지 않아서 이런 류의 질문을 많이 하게되네요.

그리고 말씀해주신걸 토대로 저 코드를 해석해보니 memberService와 AppConfig를 멤버 변수로 선언 하거나 선언하면서 바로 초기화 하는 것은 문제 없지만, 위의 코드에서는 memberService를 선언한 뒤 memberService 변수에 값을 초기화 하려고 하니까 오류가 났다는 의미가 맞는지 잘 모르겠습니다. 더 나아가 main 메소드 안에서는 해당 행위가 되기 때문에 본문의 코드가 작동했던 것이고, 클래스에서 직접 사용할때는 안된다는 것으로 이해했습니다. 사실 선언과 동시에 초기화와 선언 후 초기화 하는게 어떤 차이가 있길래 전자는 되고 후자는 안되는지에 대해서는 좀 의아하네요. 즉, 아래와 같은 코드는 된다는 것이고 본문에 기재한 코드는 안된다는게 그냥 자바에서 정해놓은 문법 그 자체인 것인지, 또 다른 이유가 있는 것인지 궁금합니다.

 

그리고 두번째 질문은 강의 중 테스트 전에 실행된다는 말을 해당 클래스가 실행되기 전이라고 받아들여서 저런 질문을 하게 됐던것 같습니다. 전체를 뜻하는줄 알았는데 각각의 테스트 메서드 실행전에 각각 한번씩 실행이 된다는 말씀으로 이해했습니다.

늘 친절한 답변 해주시고, 모르는 부분에 대해 많은 도움 주셔서 감사합니다. 개발자님과 David님을 비롯한 여러 서포터즈 분들 늘 건강하고 좋은 일이 많으셨으면 좋겠습니다. 

유진이님의 프로필 이미지
유진이
질문자

추가적으로 착각한점이 MemberApp을 보면 본문에서와 같이 코드를 입력한줄 알았는데,

이와같이 코드를 입력했습니다. 그렇다면 테스트 코드에서도 위 코드는 동작하는데 영한님께서 왜 BeforeEach를 사용한건지도 알 수 있을까요? 그냥 해당 기능을 알려주기 위해서 사용하셨다고 생각하면 될까요?

1.  자바 문법입니다.

2. 원래 테스트는 각 메서드 간 동일한 환경에서 실행되게 해야합니다. 그래서 사용되는 객체를 초기화 해주는 것이고요. 물론 강의에서 memoryMemberRepository 내 저장공간을 static으로 선언해서 초기화해도 영향을 미치지 않습니다만 일반적으로는 사용되는 객체를 초기화해줍니다.

유진이님의 프로필 이미지
유진이
질문자

아하 고맙습니다. 이해가 됐습니다 ㅎㅎ 

유진이님의 프로필 이미지
유진이

작성한 질문수

질문하기