Study
Akka

Testing Actor (Akka TestKit)

Penjelasan

Menguji actor tidak bisa dilakukan seperti menguji function biasa karena sifatnya asinkron. Akka menyediakan modul `akka-actor-testkit-typed` dengan `ActorTestKit` sebagai fondasi pengujian. Pola paling umum: buat instance `ActorTestKit`, spawn actor yang mau diuji lewat `testKit.spawn(behavior)`, lalu gunakan `TestProbe[T]` sebagai pengganti actor penerima balasan — TestProbe punya method seperti `expectMessage(pesan)` yang menunggu (dengan timeout) sampai pesan tertentu diterima, dan akan membuat test gagal secara jelas kalau pesan tidak sesuai atau tidak datang. Karena actor lain di sistem nyata biasanya membutuhkan `ActorRef[T]` sebagai parameter (bukan hardcoded), pola ini mendorong desain actor yang mudah ditest: actor menerima ActorRef tujuan balasan sebagai bagian dari pesan atau constructor, sehingga saat testing kita bisa menyuntikkan `testProbe.ref` sebagai pengganti actor asli. Setelah semua test dalam suite selesai, penting memanggil `testKit.shutdownTestKit()` untuk membersihkan ActorSystem uji agar tidak membebani resource test runner.

Contoh Konsep

import akka.actor.typed.ActorRef
import akka.actor.typed.scaladsl.Behaviors
import akka.actor.testkit.typed.scaladsl.ActorTestKit
import org.scalatest.wordspec.AnyWordSpecLike

object Sapaan {
  sealed trait Pesan
  case class Sapa(nama: String, balasKe: ActorRef[String]) extends Pesan

  def apply() = Behaviors.receiveMessage[Pesan] {
    case Sapa(nama, balasKe) =>
      balasKe ! s"Halo, $nama"
      Behaviors.same
  }
}

class SapaanSpec extends ScalaTestWithActorTestKit with AnyWordSpecLike {
  "Actor Sapaan" should {
    "membalas dengan sapaan yang benar" in {
      val probe = createTestProbe[String]()
      val sapaanActor = spawn(Sapaan())

      sapaanActor ! Sapaan.Sapa("Dunia", probe.ref)
      probe.expectMessage("Halo, Dunia")
    }
  }
}

Praktikum

Lengkapi test untuk actor Pengali yang menerima pesan Kali(a, b, balasKe) dan membalas hasil perkalian, memakai TestProbe untuk memverifikasi balasan yang diterima.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Jangan pernah memakai Thread.sleep untuk menunggu actor selesai memproses pesan di dalam test — selalu pakai expectMessage atau expectNoMessage dari TestProbe, karena keduanya punya timeout dan retry yang jauh lebih andal daripada sleep tebak-tebakan.