본문 바로가기
Swift

[Swift]에서 Mock 객체 만들기와 Protocol 주입을 통한 Unit Test

by Jimmy_iOS 2023. 6. 10.

소개

Swift에서는 Unit Test를 위해 XCTest Framework을 제공하고 있습니다. 이를 통해 개발자들은 코드의 품질을 높이고 버그를 방지할 수 있습니다.

이번 포스팅에서는 Swift에서 Mock 객체를 만들고 Protocol 주입을 통해 Unit Test하는 과정에 대해 자세히 알아보겠습니다.

Mock 객체란?

Mock 객체란, 테스트를 위해 실제 객체를 대신하여 사용되는 가짜 객체입니다. 실제 객체와 동일한 인터페이스를 가지지만, 내부적으로는 테스트를 위한 로직을 구현합니다.

예를 들어, 네트워크 요청을 테스트하기 위해서는 네트워크 요청을 하지 않고 Mock 객체를 사용하여 응답을 받는 것이 좋습니다. 이렇게 Mock 객체를 사용하면, 테스트의 성능을 향상시킬 수 있습니다.

Protocol 주입

Swift에서는 Protocol을 사용하여 객체 사이의 의존성을 줄일 수 있습니다.

(의존성 주입) 에 관한 내용이 궁금하시면 이전 포스팅에서 확인해보세요.

Protocol을 사용하면, 객체가 다른 객체를 직접 참조하지 않고, Protocol을 참조하여 객체를 생성할 수 있습니다. 이를 통해 객체간의 결합도를 줄이고, 유연성을 높일 수 있습니다.

 

예를 들어, ViewController가 네트워크 요청을 보내는 경우, ViewController에서 직접 네트워크 객체를 생성하고 사용하는 것은 좋지 않습니다. 대신 Protocol을 정의하고, 이를 ViewController가 참조하여 객체를 생성하는 것이 좋습니다.

 

이렇게 하면, 추후에 네트워크 객체를 변경해야 할 경우, ViewController를 수정하지 않고, Protocol을 구현하는 새로운 객체를 만들어서 사용할 수 있습니다.

 

Mock 객체와 Protocol의 조합을 사용하는 이유는 무엇인가요?

Mock 객체와 Protocol을 조합하여 사용하면 테스트 중에 필요한 객체를 만들고 주입할 수 있습니다. 이렇게 하면 테스트 환경에서 프로덕션 코드에 의존하지 않아 더 간단하고 견고한 유닛 테스트를 작성할 수 있습니다. Mock 객체와 Protocol은 테스트의 일관성과 직관성을 높여줍니다.

Mock 객체 만들기

Swift에서 Mock 객체를 만들기 위해서는, 가장 먼저 Mock 객체를 구현할 Protocol을 정의해야 합니다. 이후 Mock 객체를 만들어 Protocol을 구현합니다.

protocol MyProtocol {
  func myFunction() -> String
}

class MyMock: MyProtocol {
  func myFunction() -> String {
    return "Mocked Function"
  }
}

위 코드는, MyProtocol이라는 Protocol을 정의하고, 이를 구현하는 MyMock이라는 Mock 객체를 정의한 예시입니다. MyMock 객체는 MyProtocol에서 정의한 myFunction을 구현하여, "Mocked Function"이라는 값을 반환합니다.

Protocol 주입을 통한 Unit Test

Mock 객체를 만들었다면, 이를 사용하여 Unit Test를 진행할 수 있습니다. 이를 위해서는, 테스트 대상 객체가 Mock 객체를 받을 수 있도록 Protocol 주입을 해주어야 합니다.

class MyClass {
  var myProtocol: MyProtocol

  init(myProtocol: MyProtocol) {
    self.myProtocol = myProtocol
  }

  func myFunction() -> String {
    return myProtocol.myFunction()
  }
}

위 코드는, MyClass라는 객체를 정의한 예시입니다. 이 객체는, MyProtocol을 참조하고, 이를 통해 myFunction()을 호출합니다. 이 객체를 테스트하기 위해서는, Mock 객체를 MyClass에 주입하여 테스트를 진행할 수 있습니다.

class MyTest: XCTestCase {
  func testMyClass() {
    let mock = MyMock()
    let myClass = MyClass(myProtocol: mock)
    XCTAssertEqual(myClass.myFunction(), "Mocked Function")
  }
}

위 코드는, MyTest라는 테스트 객체를 정의한 예시입니다. 이 객체에서는, MyMock객체를 생성하고, 이를 MyClass에 주입하여 테스트를 진행합니다. 이후, XCTAssertEqual을 사용하여 예상한 값과 실제 값이 일치하는지 확인합니다.

결론

Swift에서는 Mock 객체를 만들고, Protocol 주입을 통해 Unit Test를 진행할 수 있습니다. 이를 통해 객체 간의 결합도를 줄이고, 유연성을 높일 수 있습니다.

이번 포스팅에서는 Mock 객체를 만드는 방법과, Protocol 주입을 통한 Unit Test를 진행하는 방법에 대해 자세히 알아보았습니다. 이를 통해 코드의 품질을 높이고, 버그를 방지하는데 도움이 되기를 바랍니다.

 

다음 포스팅에서는 실제로 제 프로젝트에서 테스트한 Mock객체를 만들어서 UnitTest하는 방법에 대해서 알아보겠습니다.