본문 바로가기
Test Code

[JUnit] 스트림(Stream)을 이용한 JUnit기반 테스트 코드 작성

by bkuk 2023. 4. 14.

도메인 모델

사람의 속성인 이름과 나이를 멤버 변수로 가지는도메인 모델이다. 

public class Person {
    private String name;
    private int age;
    
    public Person( String name, int age ) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

요구사항 충족하는 테스트 코드를 작성

  • 사람들 중에 성인(나이가 26세 이상인 사람)이 있는지를 검증하는 JUnit 테스트를 작성
  • 모든 사람의 이름을 대문자로 변환하여 리스트로 반환하는 JUnit 테스트를 작성

 

@BeforeEach를 통한 각 테스트 메서드의 준비 작업 수행

BeforeEach 어노테이션은 테스트 메서드가 실행되기 전에 반복적으로 필요한 설정이나 초기화 작업을 수행하는 용도로 사용한다.

class PersonTest {
    private List<Person> people;
    
    @BeforeEach
    void setup() {
        people = Arrays.asList(
                new Person("bk", 18),
                new Person("dk", 30),
                new Person("yk", 25),
                new Person("uk", 12));
    }
}

 

사전 알고가기

  • stream() : 컬렉션(Collection)이나 배열(Array)에서 스트림을 생성하는 메서드로, 스트림 파이프 라인을 구축하기 위해 사용
  • map() : 스트림의 요소들을 하나씩 변환하는 메서드. 특정 필드나 메서드를 추출하여 새로운 값을 매핑하는데 사용. 스트림의 변환 작업을 수행하는 중요한 중간 연산이다.
  • collect() : 스트림의 요소들을 수집하여 새로운 컬렉션이나 값을 생성하는 메서드. 스트림의 요소들을 리스트, 셋, 맵 등의 컬렉션으로 변환하는 등의 최종 연산에 해당한다.
  • ::(메서드 레퍼런스) : 메서드 참조를 간단하게 표현하는 방법이다. 클래스명 또는 객체명과 메서드명을 연결하여 표현 가능하다. 예를 들면, 'Person::getName' 은 'Person' 클래스의 'getName()' 메서드를 참조하는 것을 의미한다.
  • ->(람다 표현식) : 함수형 인터페이스의 구현을 간단하게 표현하는 방법이다. 예를 들어 'person -> person.getName()'은 'person'객체의 'getName()' 메서드를 호출하는 람다 표현식을 의미함.

요구사항 1

  • 나이가 26세 이상인 사람이 있는지 검증
@Test
@DisplayName("특정 나이로 필터링이 되는지 확인:25세 초과")
void 특정_나이로_필터링() {
    // Given
    int ageToFilter = 25;

    // When
    List<Person> filteredPeople = people.stream()
                .filter(person -> person.getAge() > 25 )
                .collect(Collectors.toList());

    // Then
    assertEquals(1, filteredPeople.size());
    assertEquals("dk", filteredPeople.get(0).getName());
}

 

요구사항 2

  • 모든 사람의 이름을 대문자로 변환하여 리스트로 반환하는 JUnit 테스트를 작성
@DisplayName("모든 사람의 이름을 대문자로 변환하여 리스트로 반환하는지 확인")
@ParameterizedTest
@ValueSource(strings = {"BK", "DK", "YK", "UK"})
void 대문자_변환(String upperName) {
    // Given: Person 클래스

    // When
    List<String> upperCaseNames = people.stream()
                    .map(person -> person.getName().toUpperCase())
                    .collect(Collectors.toList());

    // Then
    assertTrue(upperCaseNames.contains(upperName));
}

 

 

댓글