• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@beforeEach 사용하는 이유가 궁금합니다.

23.01.24 10:36 작성 조회수 589

2

@beforeEach 를 사용하면 모든 테스트는 자신이 실행되기 전에 이 작업을 수행한다 라고 되어있는데

MemberServiceTest 부분에서 @beforeEach를 안쓰고

MemberService memberService;
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();

위와같이 쓰니 오류(Unknown class: 'memberService')가 났습니다.

MemberService memberService;
@BeforeEach
public void beforeEach(){
    AppConfig appConfig = new AppConfig();
    memberService = appConfig.memberService();
}

위의 코드처럼 @BeforeEach 사용해야 appConfig와 memberService를 정의 할 수 있는 이유가 궁금하며

@BeforeEach가 없으면 왜 오류가 나는지 궁금합니다.

답변주시면 정말 감사하겠습니다.

답변 1

답변을 작성해보세요.

2

OMG님의 프로필

OMG

2023.01.24

안녕하세요. 박희재님, 공식 서포터즈 OMG입니다.
.

(1)

image

질문으로 올리신 내용은 위와 같은 코드인 것 같습니다.

필드 영역내에서 해결하려면(동작하게 하려면)

(2)

image

위와 같이 변경하면 됩니다.

@BeforeEach가 없으면 에러가 나는 이유를 코드로 설명드리면

image

필드영역 내에서

LIMIT_HOUR 변수를 10으로 할당하는 것은 가능하지만 추가적인 연산은 불가능합니다.

그래서 1번은 오류가 없지만 2번은 오류가 발생합니다.


.
감사합니다.

OMG님의 프로필

OMG

2023.01.24

image

int a;

int b = 10; 과 같은 형태는 가능하지만 a = b;와 같은 연산은 불가능하다고 이해하시면 됩니다.

자바에서 필드영역에서는 변수초기화만 되고 연산은 안되는 건가요?

@BeforeEach없이 아래 코드가 작동이 된다면

AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();

굳이 @BeforeEach를 쓰신 이유가 먼지 궁금합니다.

( @BeforeEach가 모든 테스트는 자신이 실행되기 전에 이 작업을 수행한다 라고 되어있는데 이걸 안써도 되는데 사용하는 이유가 먼가요?? )

이번 예시로만이 아니라 @BeforeEach를 왜쓰는 지가 궁금합니다. 제 생각으로는 그냥 테스트하기 전에 코드를 적으면 알아서 테스트전에 수행 될텐도 말이죠...

답변해주시면 정말 감사하겠습니다.

OMG님의 프로필

OMG

2023.01.24

자바에서 필드영역에서는 변수초기화만 되고 연산은 안되는 건가요?

네.

class Foo {

int a;

a = 10;

a = a + 1;

public void bar() {

}

}

일반적으로 만드는 클래스의 구조에서 a = 10, a = a + 1; 과 같은 코드는 작성하지 않습니다. 실행도 안되구요.

본 강의의 선수 지식인 자바 기초에 해당하는 내용으로 해당 내용을 별도로 학습하시면 좋을 것 같아요.

 

 

@BeforeEach없이 아래 코드가 작동이 된다면

AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();

굳이 @BeforeEach를 쓰신 이유가 먼지 궁금합니다.

( @BeforeEach가 모든 테스트는 자신이 실행되기 전에 이 작업을 수행한다 라고 되어있는데 이걸 안써도 되는데 사용하는 이유가 먼가요?? )

이번 예시로만이 아니라 @BeforeEach를 왜쓰는 지가 궁금합니다. 제 생각으로는 그냥 테스트하기 전에 코드를 적으면 알아서 테스트전에 수행 될텐도 말이죠...

본 강의 테스트로는 @BeforeEach를 사용하지 않고 무방합니다. 하지만 좋은 단위테스트를 작성하는 FIRST원칙에서 R에 해당하는 내용을 지켜서 테스트를 작성했다고 보시면 됩니다.

그리고, 지금은 테스트가 1개지만 MemberService에 대한 역할이 늘어나 다른 테스트가 추가된다고 한다면 박희재님이 생각한 코드로 작성해야 한다면 새로운 테스트도 추가해야하지만 기존의 코드까지 @BeforeEach를 사용하도록 변경해야합니다.

처음 @BeforeEach로 반복적인 테스트를 실행하더라도 동일한 환경을 만들어놨다면 테스트만 추가했으면 됐을텐데 말이죠.

실용적인 측면과 지금 당장 편한 방법만을 추구하지말고 확장성을 고려한 코드 작성도 고려하면 변화에 대응하기 수월해집니다.

 

FIRST원칙

https://velog.io/@sdb016/%EC%A2%8B%EC%9D%80-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8-FIRST%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC