inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

관심사의 분리

MemberServiceTest 질문 있습니다.

239

유진이

작성한 질문수 28

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에 밖에 존재하는지 ?

 

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

oop spring

답변 1

0

David

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

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

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

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

 

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

감사합니다.

 

 

0

유진이

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

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

 

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

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

0

유진이

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

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

0

David

1.  자바 문법입니다.

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

0

유진이

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

섹션3. 11 회원객체 다이어그램

0

26

1

OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.

0

24

1

코드 자료

0

62

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

67

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

88

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

97

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

83

1

테스트 속도가 나중에 영향이 있을까요?

0

84

1

gradle 설정 안떠서 질문 남깁니다!

0

129

2

build.gradle로 프로젝트를 여는 이유

0

93

1

provider 사용하는 이유

0

95

1

다음 강의 뭘 들어야 할까요

0

131

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

66

1

beanB

0

85

2

퀴즈다시풀기

0

70

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

98

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

67

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

107

2

도메인의 정의?

0

60

1

ApplicationContext 질문입니다.

0

67

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

95

2

ai api 선정하기 관련 질문

0

125

2

생성자 자동주입 관련해서

0

68

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

99

2