Kotest, Mockk 가이드 Youtube

테스트 작성 방법

  1. 틀 짜기
    • 구현 사항을 테스트로 옮긴다.
      • 프로그래밍 언어로 구현하기에 앞서 사람의 언어로 테스트 제목을 작성한다.
      • 테스트 제목에 맞춰 테스트 내용을 작성한다. 컴파일 오류는 무시한다.

    • 테스트 내용에 맞춰 파일을 생성한다.
      • 테스트할 클래스를 추상 클래스로 선언해도 된다(모의 객체이거나 템플릿 메서드 패턴을 적용하는 경우 등).
      • 메서드는 구현하지 않고 우선 TODO()을 사용해서 비워둔다.

  2. 테스트의 컴파일 에러 없애기
    • 테스트 클래스의 객체를 생성한다.
      • spy를 생성하여 구현된 메서드의 동작을 테스트한다.
      • 테스트 클래스가 추상 클래스라면 추상 클래스를 구현하는 익명 객체의 spy를 생성한다1.
      • private 메서드를 호출하는 경우 recordPrivateCalls를 true로 설정한다.

    • 테스트 클래스의 생성자에 전달할 객체를 생성한다.
      • mock을 생성하여 구현 사항에 의존하지 않도록 한다.
      • relaxed를 true로 설정한다.

  3. 테스트가 성공하도록 만들기
    • 테스트 내용을 참고하여 테스트할 클래스의 메서드를 구현한다.
      • 메서드 내부에서 필드를 사용하는 경우 이 과정을 다른 메서드로 분리하는 것이 좋다2.
      • 메서드가 반환 객체를 필요로 하는 경우 같은 반환 타입을 갖는 메서드를 추가로 만들고, 해당 메서드를 호출한 결과를 반환한다. 해당 메서드는 TODO()을 사용해서 비워둔다.

    • 테스트할 메서드가 아닌 메서드는 모킹한다.
      • 메서드 내부는 TODO()을 사용해서 비워두고, 테스트 파일에서 반환 타입의 mock을 반환하도록 한다.
      • 테스트를 간단하게 만들려면 메서드가 성공 케이스의 값을 반환하게 한 후에, 실패 케이스만 테스트한다.

1추상 클래스의 생성자를 통해 인자를 전달하기 위한 것. 추상 클래스의 spy를 생성하면 생성자를 통해 인자를 전달할 수 없다.
2필드를 직접 사용하면 테스트가 필드의 구현 사항에 의존하게 된다. 필드 내부의 필드나 메서드를 모킹하지 말고, 필드를 사용하는 코드를 메서드로 분리하여 해당 메서드를 모킹하자.