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.
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.