1. Question

람다 표현식(lambda expression)단위 테스트(unit testing) 하는 방법은?

2. Answer

Java 8에서 도입된 람다 표현식을 단위 테스트하는 방법은 코드의 견고성과 유지보수성을 보장하는 데 중요하다. 단위 테스트를 통해 람다 표현식을 검증하는 주요 방법은 다음과 같다.

  • 컬렉션 필터링 메서드 테스트: JUnit을 활용하여 주어진 조건에 따라 요소를 필터링하는 메서드를 검증한다.

  • 람다 표현식 직접 테스트: 람다 표현식을 변수에 할당하고 조건을 직접 테스트한다.

  • Mockito를 사용한 외부 의존성 목킹: Mockito를 활용하여 외부 서비스 호출을 모의화하여 람다 표현식을 포함한 메서드를 테스트한다.

3. Detail

A. 컬렉션 필터링 메서드 테스트

Java에서 컬렉션의 요소를 필터링하는 간단한 메서드를 고려해본다. 이 메서드는 ListPredicate를 인자로 받아, 조건에 맞는 요소만을 필터링하여 새로운 List로 반환한다.

public class ListFilter {
  public static List<String> filterStrings(List<String> input, Predicate<String> condition) {
    return input.stream()
      .filter(condition)
      .collect(toList());
  }
}

이 메서드를 테스트하기 위한 JUnit 테스트 클래스는 다음과 같다.

public class ListFilterTest {
  @Test
  public void testFilterStrings() {
    List<String> input = Arrays.asList("apple", "banana", "cherry", "date");
    Predicate<String> condition = s -> s.startsWith("a");

    List<String> result = ListFilter.filterStrings(input, condition);

    assertEquals(Arrays.asList("apple"), result);
  }
}

B. 람다 표현식 직접 테스트

람다 표현식 자체를 변수에 할당하고, 이를 직접 테스트하는 방법이다. 예를 들어, 문자열이 특정 조건을 만족하는지 검사하는 Predicate<String>을 테스트한다.

public class LambdaDirectTest {
  @Test
  public void testStringNotEmpty() {
    Predicate<String> isNotEmpty = s -> !s.isEmpty();

    assertTrue(isNotEmpty.test("hello"));
    assertFalse(isNotEmpty.test(""));
  }
}

C. Mockito를 사용하여 람다 표현식을 포함한 메서드의 외부 의존성 목킹

람다 표현식이 외부 서비스를 호출하는 경우, Mockito를 사용하여 해당 서비스를 목(mock)으로 만들고 람다의 동작을 테스트할 수 있다. 예를 들어, UserService가 사용자 이름을 검증하는 람다 표현식을 사용하는 경우, 이 서비스읭 호출을 mock으로 만들어 테스트할 수 있다. (실제 UserService 구현이나 호출 방법은 생략되었다.)

public class UserServiceTest {
  @Mock
  UserService userService;  // Mockito를 사용하여 목 mock 객체 생성

  @Test
  public void testUsernameValidation() {
    // userService.validateUsername 람다 표현식의 동작을 테스트
    when(userService.validateUsername(anyString())).thenReturn(true);

    // 테스트 로직 ...
  }
}

4. Reference

None

태그:

카테고리:

업데이트:

댓글남기기