2016-07-30 8 views
2

Ich versuche Einheitstests für meinen Schauspieler zu schreiben und bin auf Grund spotten stecken. PriceAggregateActor verwendet akka persistence und ich möchte nicht das ganze conf dafür übergeben und möchte es komplett ausspionieren.Mocking Kind Schauspieler in Akka

Dies ist der Schauspieler, die ich

object CommandPriceActor { 
    def apply() = Props(classOf[CommandPriceActor], PriceAggregateActor()) 
} 

class CommandPriceActor(priceAggregateActorProps: Props) extends Actor with ActorLogging { 

    val priceAggregateActor = context.actorOf(priceAggregateActorProps, "priceAggregateActor") 

Also in meinen Tests Ich versuche, etwas zu tun, wie testen wollen:

class CommandPriceActorTest extends TestKit(ActorSystem("test-benefits", 
    ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"] """))) with FlatSpecLike with Matchers 
    with BeforeAndAfterAll with Eventually{ 

    class MockedChild extends Actor { 
    def receive = { 
     case _ => lala 
    } 
    } 

    val probe = TestProbe() 
    val commandPriceActor = TestActorRef(new CommandPriceActor(Props[MockedChild])) 

Ich bin immer bekommen:

Caused by: java.lang.IllegalArgumentException: no matching constructor found on class CommandPriceActorTest$MockedChild for arguments [] 

Warum beschwert sich über MockedChild? Es sollte keine Konstruktorargumente enthalten.

Antwort

1

Dies ist, weil MockedChild ein Kind Schauspieler Ihres Tests ist. Das fehlende Konstruktorargument ist der Verweis auf den Test (die Elternklasse).

Sie haben drei Möglichkeiten:

  1. Führen Sie den Verweis auf this in Props
  2. Verwenden Sie die benannten Parameter Form Props
  3. Fabrikat MockedChild eine Top-Level-Klasse (oder ein Mitglied eines Objekts)

Option 1

val probe = TestProbe() 
val mockProps = Props(classOf[MockedChild], this) 
val commandPriceActor = TestActorRef(new CommandPriceActor(mockProps)) 

Option 2

val probe = TestProbe() 
val mockProps = Props(new MockedChild) 
val commandPriceActor = TestActorRef(new CommandPriceActor(mockProps)) 

Option 3

val probe = TestProbe() 
val mockProps = Props(new CommandPriceActorTest.MockedChild) 
val commandPriceActor = TestActorRef(new CommandPriceActor(mockProps)) 

// .... 

object CommandPriceActorTest { 
    class MockedChild extends Actor { 
    def receive = { 
     case _ => lala 
    } 
    } 
} 
+0

ich bekommen, was Sie sagen, aber wie schreibe ich, dass in Code? :) – Reeebuuk

+0

Ich habe einige Beispiele hinzugefügt. Die ursprüngliche Antwort wurde in einem Flughafen auf meinem Handy gemacht. – iain

+0

Funktioniert wie ein Charme! Thx Ian :) – Reeebuuk

Verwandte Themen