package org.akka.essentials.stm.transactor.example; import akka.actor.ActorSystem; import akka.actor.Props; import akka.testkit.TestActorRef; import akka.testkit.TestKit; import org.akka.essentials.stm.transactor.example.msg.AccountBalance; import org.akka.essentials.stm.transactor.example.msg.TransferMsg; import org.junit.Assert; import org.junit.Test; import scala.concurrent.Await; import scala.concurrent.duration.Duration; import static akka.pattern.Patterns.ask; public class BankTest extends TestKit { static ActorSystem _system = ActorSystem.create("STM-Example"); public BankTest() { super(_system); } @Test public void successTest() throws Exception { TestActorRef<BankActor> bank = TestActorRef.apply(new Props( BankActor.class), _system); bank.tell(new TransferMsg(Float.valueOf("1777"))); AccountBalance balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("XYZ"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("3223"), balance.getBalance(), Float.parseFloat("0")); balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("ABC"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("2777"), balance.getBalance(), Float.parseFloat("0")); } @Test public void failureTest() throws Exception { TestActorRef<BankActor> bank = TestActorRef.apply(new Props( BankActor.class), _system); bank.tell(new TransferMsg(Float.valueOf("1500"))); AccountBalance balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("XYZ"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("3500"), balance.getBalance(), Float.parseFloat("0")); balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("ABC"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("2500"), balance.getBalance(), Float.parseFloat("0")); bank.tell(new TransferMsg(Float.valueOf("4000"))); Thread.sleep(2000); balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("XYZ"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("3500"), balance.getBalance(), Float.parseFloat("0")); balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("ABC"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("2500"), balance.getBalance(), Float.parseFloat("0")); } }