Flutter로 노트 앱을 개발할 때, 정렬 기능이 제대로 작동하는지 확인하는 것은 중요한 부분입니다.
Mockito를 활용하여 정렬 로직을 테스트하는 과정을 코드와 함께 설명하겠습니다.
아래 정렬 기능이 정상 동작함을 확인합니다.
각 정렬 옵션에 대해 올바른 결과를 반환하는지 확인하며, 의존성(저장소) 호출도 검증합니다.
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'get_notes_use_case_test.mocks.dart';
([NoteRepository])
void main() {
test('정렬 기능이 잘 동작해야 한다', () async {
final repository = MockNoteRepository();
final getNotes = GetNotesUseCase(repository);
// 동작 정의
when(repository.getNotes()).thenAnswer((_) async => [
Note(title: 'title', content: 'content', timestamp: 0, color: 1),
Note(title: 'title2', content: 'content2', timestamp: 2, color: 2),
]);
List<Note> result = await getNotes(const NoteOrder.date(OrderType.descending()));
expect(result, isA<List<Note>>()); //타입 검사
expect(result.first.timestamp, 2);
verify(repository.getNotes());
result = await getNotes(const NoteOrder.date(OrderType.ascending()));
expect(result.first.timestamp, 0);
verify(repository.getNotes());
result = await getNotes(const NoteOrder.title(OrderType.ascending()));
expect(result.first.title, 'title');
verify(repository.getNotes());
result = await getNotes(const NoteOrder.title(OrderType.descending()));
expect(result.first.title, 'title2');
verify(repository.getNotes());
result = await getNotes(const NoteOrder.color(OrderType.ascending()));
expect(result.first.color, 1);
verify(repository.getNotes());
result = await getNotes(const NoteOrder.color(OrderType.descending()));
expect(result.first.color, 2);
verify(repository.getNotes());
verifyNoMoreInteractions(repository);
});
}
GetNotesUseCase가 제공하는 노트 리스트를 정렬하는 기능이 제대로 작동하는지 확인하겠습니다.
노트를 날짜, 제목, 색상 기준으로 정렬할 수 있습니다.
정렬 방향은 오름차순(ascending) 또는 내림차순(descending)으로 지정할 수 있습니다.
Mockito
의존성을 격리하기 위해 사용하는 Dart 모의(Mock) 라이브러리입니다.
테스트에서 가짜 데이터 저장소(MockNoteRepository)를 사용합니다.
Flutter Test
Flutter에서 기본 제공하는 테스트 도구로, test 블록을 통해 각 기능을 검증합니다.
테스트 코드를 단계별로 분석하겠습니다.
([NoteRepository])
NoteRepository를 모의(Mock) 객체로 생성합니다.
모의 객체는 실제 데이터베이스나 API 호출 없이도 동작을 시뮬레이션합니다.
final repository = MockNoteRepository();
final getNotes = GetNotesUseCase(repository);
MockNoteRepository를 초기화합니다.
정렬 로직을 포함한 GetNotesUseCase 객체를 생성합니다.
when(repository.getNotes()).thenAnswer((_) async => [
Note(title: 'title', content: 'content', timestamp: 0, color: 1),
Note(title: 'title2', content: 'content2', timestamp: 2, color: 2),
]);
repository.getNotes()가 호출되었을 때 반환될 가짜 데이터를 정의합니다.
timestamp가 0과 2인 노트 2개를 준비합니다.
각각 제목과 색상이 다릅니다.
result = await getNotes(const NoteOrder.date(OrderType.descending()));
expect(result.first.timestamp, 2);
내림차순으로 정렬했을 때, 최신 노트(timestamp: 2)가 첫 번째로 와야 합니다.
result = await getNotes(const NoteOrder.date(OrderType.ascending()));
expect(result.first.timestamp, 0);
오름차순으로 정렬했을 때, 오래된 노트(timestamp: 0)가 첫 번째로 와야 합니다.
result = await getNotes(const NoteOrder.title(OrderType.ascending()));
expect(result.first.title, 'title');
오름차순으로 정렬하면 알파벳 순으로 'title'이 첫 번째입니다.
result = await getNotes(const NoteOrder.title(OrderType.descending()));
expect(result.first.title, 'title2');
내림차순으로 정렬하면 'title2'이 첫 번째입니다.
result = await getNotes(const NoteOrder.color(OrderType.ascending()));
expect(result.first.color, 1);
오름차순 정렬 시 색상 값이 작은 1이 첫 번째입니다.
result = await getNotes(const NoteOrder.color(OrderType.descending()));
expect(result.first.color, 2);
내림차순 정렬 시 색상 값이 큰 2가 첫 번째입니다.
verify(repository.getNotes());
verifyNoMoreInteractions(repository);
repository.getNotes()가 호출되었는지 확인합니다.
추가적인 불필요한 호출이 있다면 오류가 나기 때문에 코드를 검증할 수 있습니다.
verifyNoMoreInteractions() : 추가로 repository를 활용했는지 확인합니다.
테스트는 정렬 기능이 다양한 조건에서 올바르게 작동하는지 보장합니다.
Mockito를 활용하면 의존성을 격리하여 테스트를 쉽고 간결하게 작성할 수 있습니다.
또한, 테스트 코드는 Use Case와 Repository 간의 연결을 검증하여 애플리케이션의 안정성을 높이는 데 기여합니다.