Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Makalah
  • Ke-NU-an
  • Kabar
  • Search
Menu

Stub_Gen, Package Flutter untuk Buat Stub Object dengan Cepat

Posted on June 8, 2024

Dunia pengembangan aplikasi mobile semakin dinamis. Flutter, sebagai framework cross-platform populer, terus berkembang dengan fitur-fitur baru seperti sealed class, record, dan deconstructing via pattern matching di Dart 3. Peningkatan ini tentunya membuat pengembangan aplikasi Flutter semakin menarik!

Artikel ini akan membahas stub_gen, sebuah package Dart yang dapat membuat stub secara otomatis untuk objek Dart. Stub sendiri berguna untuk memfasilitasi pembuatan unit test, terutama ketika kita berhadapan dengan class yang besar dan kompleks.

Kenapa Menggunakan Stub?

Stub memiliki beberapa manfaat dalam pengembangan aplikasi, terutama saat:

  • Menulis unit test untuk class besar: Mengisolasi logika class yang kompleks menjadi lebih mudah dengan bantuan stub.
  • Mengembangkan fitur baru tanpa menunggu tim lain: Anda dapat melanjutkan pengembangan fitur baru tanpa terpaku pada progres tim lain, misalnya tim backend server.

Membuat stub secara manual biasanya membutuhkan penetapan nilai awal untuk setiap parameter. Proses ini bisa memakan waktu dan membosankan. Inilah mengapa stub_gen hadir untuk membantu Anda!

Melihat Manfaat stub_gen dengan Contoh

Mari kita lihat contoh kode aplikasi berikut:

class Todo {
  Todo({
    required this.id,
    required this.title,
    required this.isDone,
    required this.deadline,
    required this.completeFraction,
    required this.ownerId,
  });

  final String id;
  final String title;
  final bool isDone;
  final DateTime deadline;
  final double completeFraction;
  final String ownerId;
}

class System {
  static Future<Todo> makeDone({required String todoId}) async {
    final todo = await Server.fetch(id: todoId);
    todo.isDone = true;
    todo.completeFraction = 1.0;
    await Server.store(todo: updatedTodo);
    return updatedTodo;
  }
}

class Server {
  static final Map<String, Todo> _memory = {};

  static Future<Todo> fetch({required String id}) async {
    return _memory[id]!;
  }

  static Future<void> store({required Todo todo}) async {
    _memory[todo.id] = todo;
  }
}

Untuk mempermudah, contoh ini menggunakan Server in-memory yang tidak terhubung ke jaringan nyata.

Sekarang, kita ingin menguji objek System yang memiliki method makeDone.

Skenario Unit Test:

  • Given: Tugas sedang berlangsung.
  • When: Tugas diselesaikan.
  • Then: Tugas menjadi selesai dengan completeFraction 1.
import 'package:test/test.dart';

void main() {
  group('System', () {
    test('makeDone sets task to done with completeFraction 1.0', () async {
      // Given
      final todo = Todo(
        id: '1',
        title: 'Test Task', // Boilerplate
        isDone: false,
        deadline: DateTime.now().add(const Duration(day: 1)),
        completeFraction: 0.5,
        ownerId: 'owner1', // Boilerplate
      );

      // Store the initial Todo in the server's memory
      Server._memory[todo.id] = todo;

      // When
      final updatedTodo = await System.makeDone(todoId: todo.id);

      // Then
      expect(updatedTodo.isDone, true);
      expect(updatedTodo.completeFraction, 1.0);
    });
  });
}

Meskipun unit test ini sederhana, terdapat beberapa boilerplate seperti title: 'Test Task' dan ownerId: 'owner1'. Saat aplikasi berkembang, boilerplate ini dapat menjadi penghambat penulisan unit test yang bersih.

stub_gen: Solusi untuk Boilerplate

Dengan menggunakan anotasi @StubGen dari stub_gen, kita dapat mengurangi boilerplate pada unit test.

1. Tambahkan Anotasi @StubGen

Tambahkan anotasi @StubGen() ke class yang ingin dibuatkan stub.

@StubGen()
class Todo {
  Todo({
    required this.id,
    required this.title,
    required this.isDone,
    required this.deadline,
    required this.completeFraction,
    required this.ownerId,
  });

  final String id;
  final String title;
  final bool isDone;
  final DateTime deadline;
  final double completeFraction;
  final String ownerId;
}

sadsad

Lanjutan: Meningkatkan Kualitas Unit Test dengan stub_gen di Flutter

2. Generate Stub Code

Setelah menambahkan anotasi @StubGen, jalankan perintah build_runner build untuk menghasilkan stub code.

3. Gunakan Stub di Unit Test

Sekarang, Anda dapat menggunakan stub di unit test Anda.

import 'package:test/test.dart';

void main() {
  group('System', () {
    test('makeDone sets task to done with completeFraction 1.0', () async {
      // Given
      // NOTE: Anda tidak perlu menetapkan nilai persis seperti pada boilerplate.
      final todo = TodoStub.stub(
        isDone: false,
        deadline: DateTime.now().add(const Duration(day: 1)),
        completeFraction: 0.5,
      );

      // Store the initial Todo in the server's memory
      Server._memory[todo.id] = todo;

      // When
      await System.makeDone(todoId: todo.id);

      // Then
      final updatedTodo = Server._memory[todo.id]!;
      expect(updatedTodo.isDone, true);
      expect(updatedTodo.completeFraction, 1.0);
    });
  });
}

Dengan menggunakan stub_gen, unit test Anda menjadi lebih mudah dibaca dan dipahami. Anda tidak perlu lagi terjebak dalam boilerplate yang membosankan.

Kesimpulan

stub_gen dapat membantu Anda menulis unit test yang lebih baik dan lebih cepat dengan mengurangi boilerplate dan meningkatkan keterbacaan kode.

Semoga bermanfaat!

Terbaru

  • Google Tingkatkan Batas Gratis Gemini 3 Pro untuk Pengembang dan Bisnis
  • Google Perkenalkan ‘Circle to Search’: Cara Baru Menggunakan AI untuk Pencarian
  • OpenAI Terpapar Data Pelanggan Melalui Pelanggaran Vendor Mixpanel, API Terpengaruh
  • Error External Drive Extraction Tidak Terdeteksi di VM Virtual Hyper-V
  • Ringkasan Notifikasi Pixel Google Lebih Baik dari iPhone, Tapi Apa Tujuannya?
  • ShadowV2 Botnet Digunakan Uji Coba Setelah Penyebab Gangguan AWS
  • YouTube TV Segera Kembali Menawarkan Saluran Univision Setelah Penangguhan Dua Bulan
  • YouTube TV dan Disney Meluncurkan Penawaran Paket Bundel dengan Harga Menarik
  • Error Microsoft .NET Framework: Unhandled Exception – Not Enough Space On The Disk
  • Qualcomm Snapdragon 8 Gen 5: Chipset Flagship Baru yang Lebih Cepat dan Efisien
  • Serangan ONSolve Terus Mengganggu Sistem Peringatan Darurat di Seluruh Amerika Serikat
  • Android 16 Akan Membawa QPR2 untuk Launcher Pixel, Fokus pada Pengalaman Pengguna yang Ditingkatkan
  • Android 16 (QPR2) Akan Membawa Perubahan Signifikan pada Launcher Pixel
  • Microsoft Akan Tingkatkan Kinerja Microsoft Teams dengan Pengelola Panggilan Baru
  • Samsung Meluncurkan Diskon Besar-besaran untuk Penjualan Black Friday 2025, Berapa Harga Terbaru?
  • Samsung Black Friday Sale Phones and Rings Discounts – Huge Savings on Galaxy Devices
  • Error ‘Insufficient Permissions’ (Izin Tidak Cukup) Saat Membuka Email di Windows – Solusi dan Penjelasan Lengkap
  • Hadir dengan Refresh Rate 144 Hz! Ini Rekomendasi Laptop Gaming 10 Jutaan dari ASUS
  • Cara Memperbaiki Error ScanPST.exe dan File PST di Microsoft Outlook
  • Cara Mengatasi Error DWMAPI.DLL is either not designed or not found
  • Cara Memperbaiki Error Equation/Rumus Jelek di Microsoft Word
  • Cara Mengatasi Adapter Jaringan VMware yang Hilang di Windows 11
  • Cara Reset Multi-Factor Authentication (MFA) di Microsoft Entra
  • Cara Mengatasi Masalah Konektivitas VM Hyper-V ke Host
  • Cara Memperbaiki Error 0x8000FFFF Catastrophic Failure Saat Ekstrak Zip
  • Cara Memperbaiki File Explorer Crash Saat Membuka Folder Besar di Windows 11/10
  • Cara Mengatasi Error Login 0x8007003B di Outlook, Microsoft, XBox dll
  • Cara Memulihkan Akun Admin Microsoft 365 Karena MFA Gagal
  • Cara Mengatasi Error “A Conexant audio device could not be found”
  • Cara Memperbaiki Windows Tidak Nyala Lagi Setelah Sleep/Locked
  • Google Tingkatkan Batas Gratis Gemini 3 Pro untuk Pengembang dan Bisnis
  • Google Perkenalkan ‘Circle to Search’: Cara Baru Menggunakan AI untuk Pencarian
  • OpenAI Terpapar Data Pelanggan Melalui Pelanggaran Vendor Mixpanel, API Terpengaruh

©2025 emka.web.id | Design: Newspaperly WordPress Theme