[flutter] get_it를 사용하여 프로덕션 코드를 단위 테스트하는 방법은?

get_it은 의존성 주입(Dependency Injection)을 위한 패키지로, Flutter 애플리케이션의 객체 인스턴스를 관리하고 필요한 곳에 주입할 수 있도록 도와줍니다. 하지만 프로덕션 코드를 단위 테스트할 때 get_it를 어떻게 사용해야 할까요?

get_it를 단위 테스트에 사용하려면 몇 가지 단계를 거쳐야 합니다.

1. 테스트용 의존성으로 대체하기

프로덕션 코드를 단위 테스트하기 위해서는 get_it를 사용하여 특정 객체의 인스턴스를 대체해야 합니다. 이것은 테스트에 사용할 모의(mock) 객체를 생성하는 데 사용됩니다.

예를 들어, 다음과 같이 MyService라는 클래스가 있고 이를 테스트하려고 한다고 가정해봅시다.

class MyService {
  void doSomething() {
    // ...
  }
}

테스트에서는 이 객체를 모의 객체로 대체하려고 합니다. 이를 위해 모의 객체를 만들고 get_it을 사용해 이를 등록해야 합니다.

import 'package:mockito/mockito.dart';

class MockMyService extends Mock implements MyService {}

void main() {
  setUp(() {
    // get_it에 모의 객체를 등록
    GetIt.instance.registerSingleton<MyService>(MockMyService());
  });

  // 테스트 코드 작성
  // ...
}

2. 테스트에서 get_it 사용하기

이제 테스트 코드 내에서 get_it을 사용하여 등록한 모의 객체를 가져와 사용할 수 있습니다.

void main() {
  setUp(() {
    GetIt.instance.registerSingleton<MyService>(MockMyService());
  });

  test('MyService.doSomething() 호출 시 모의 객체의 메서드가 호출되는지 확인', () {
    final myService = GetIt.instance<MyService>();
    myService.doSomething();

    // 모의 객체의 메서드가 호출되었는지 확인하는 코드 작성
    // ...
  });
}

테스트 코드에서 GetIt.instance<MyService>()와 같이 사용하여 get_it에서 등록한 모의 객체를 가져올 수 있습니다.

3. 테스트 종료 후 get_it 등록 해제하기

마지막으로, 테스트 종료 후에는 get_it에 등록한 모의 객체를 해제해야 합니다.

void main() {
  tearDown(() {
    GetIt.instance.reset(); // get_it에서 등록한 모의 객체 해제
  });

  // 테스트 코드 작성
  // ...
}

tearDown 함수를 사용하여 테스트 종료 후 get_it에서 등록한 모의 객체를 해제합니다. 이렇게 하면 다음 테스트를 실행할 때 새로운 모의 객체를 등록할 수 있습니다.

이제 get_it를 사용하여 프로덕션 코드를 단위 테스트할 준비가 되었습니다. get_it를 사용하면 의존성 주입을 손쉽게 관리할 수 있어 코드의 테스트 가능성과 유지 관리성이 향상됩니다.

참고 자료