3

アクターの単体テストを作成しようとしていますが、基本的なモックに固執しています。PriceAggregateActor は akka の永続性を使用しており、すべての conf を渡したくなく、完全にモックしたいと考えています。

これは私がテストしたい俳優です

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

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

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

だから私のテストでは、次のようなことをしようとしています:

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]))

私はいつも得ています:

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

なぜそれはmockedChildについて不平を言っているのですか? コンストラクター引数を取らないでください。

4

1 に答える 1

1

これは、MockedChild がテストの子アクターであるためです。欠落しているコンストラクター引数は、テスト (親クラス) への参照です。

次の 3 つのオプションがあります。

  1. thisへの参照を渡すProps
  2. の名前付きパラメーター形式を使用しますProps
  3. MockedChild をトップレベルのクラス (またはオブジェクトのメンバー) にする

オプション1

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

オプション 2

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

オプション 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
    }
  }
}
于 2016-07-30T21:55:33.103 に答える