인프런 커뮤니티 질문&답변
given - when - then 구조에 대해 질문 있습니다.
작성
·
155
0
@Test
void remove() {
    CafeKiosk cafeKiosk = new CafeKiosk();
    Americano americano = new Americano();
    cafeKiosk.add(americano);
    assertThat(cafeKiosk.getBeverages()).hasSize(1);
    cafeKiosk.remove(americano);
    assertThat(cafeKiosk.getBeverages()).isEmpty();
}저는 given은 CafeKiosk cafeKiosk = new CafeKiosk(); 이런식으로 객체를 생성하는 단계
when은 cafeKiosk.add(americano); 와 같이 실제 메서드를 사용하는 단계
then은 assertThat(cafeKiosk.getBeverages()).isEmpty(); 와 같이 실제값과 기대값을 검증하는 단계라고 이해를 했습니다.
- 제가 given - when - then에 대해 위와 같이 이해를 했는데 맞게 이해를 한건지 궁금합니다. 
- 먼가 깔끔한(?) 코드는 given - when - then이 딱딱 나눠져야 하는건지 (객체 생성은 given 쪽에 몰아두고 메서드 사용은 when쪽에 몰아두고 검증은 then쪽에 몰아두는) 궁금합니다. 
- 하나의 단위 테스트에서도 given - when - then 의 흐름이 여러개가 존재할 수 있나요? 전체적인 하나의 흐름만 존재하는 건지 아니면 단위 테스트 내에서도 여러 흐름이 존재하는건지 궁금합니다. 
답변 2
0
안녕하세요, 감바스 님!
1. 제가 given - when - then에 대해 위와 같이 이해를 했는데 맞게 이해를 한건지 궁금합니다.
네, 맞습니다 ㅎㅎ
2. 먼가 깔끔한(?) 코드는 given - when - then이 딱딱 나눠져야 하는건지 (객체 생성은 given 쪽에 몰아두고 메서드 사용은 when쪽에 몰아두고 검증은 then쪽에 몰아두는) 궁금합니다.
맞아요. given절은 정확히 이야기하면, 테스트를 수행하기 위한 모든 준비과정 (given="주어진" 환경)이라고 보시면 됩니다.
그래서 보통 given절이 제일 라인 수가 길고, when절은 한두줄인 경우가 대부분입니다 ㅎㅎ
3. 하나의 단위 테스트에서도 given - when - then 의 흐름이 여러개가 존재할 수 있나요? 전체적인 하나의 흐름만 존재하는 건지 아니면 단위 테스트 내에서도 여러 흐름이 존재하는건지 궁금합니다.
given-when-then이 여러 개라는 것 자체가, 테스트하고자 하는 내용이 여러가지라는 의미이므로, 테스트를 분리하는 것이 맞아요 ㅎㅎ
흐름을 가진 여러 테스트를 구성하는 방법은 뒤쪽 강의(DynamicTest)에 소개하고 있으니 참고해 주세요 ㅎㅎ
감사합니다 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
감바스님께서 주신 질문에 대해 답변드리겠습니다.
- 감바스님이 이해하신 given - when - then 구조는 정확합니다. - given은 테스트를 수행하기 위한 준비 단계입니다. 예를 들어, 객체를 생성하고, 초기 상태를 설정하는 부분입니다.
 
- when은 실제로 테스트할 동작이나 메서드를 호출하는 단계입니다.
 
- then은 동작의 결과를 검증하는 단계로, 기대값과 실제값을 비교합니다.
 
 
- 코드가 깔끔하려면 given - when - then 구조를 명확하게 나누는 것이 좋습니다. 즉, 객체 생성과 같은 설정은 given 부분에, 메서드 실행은 when 부분에, 결과 검증은 then 부분에 각각 명확히 구분하여 작성하면 가독성이 높아집니다. 
- 하나의 단위 테스트에서도 여러 개의 given - when - then 흐름이 존재할 수 있습니다. 그러나 일반적인 테스트 관례에서는 각 테스트 메서드가 고유한 단일 흐름을 따르는 것이 좋습니다. 여러 흐름을 가지게 되면 테스트의 의도가 흐려질 수 있으므로, 하나의 흐름을 따르는 것이 테스트의 명확성과 가독성을 높이는 데 유리합니다. 필요한 경우에는 여러 개의 테스트 메서드로 분리하는 것이 좋습니다. 
Spring Boot에서의 테스트와 관련한 추가 자료가 필요하시면 여기에서 확인하실 수 있습니다.
더 궁금한 점이 있으면 언제든지 질문해 주세요!






