Насмешливый ребенок актера в Акке

Я пытаюсь написать юнит-тесты для моего актера, и я застрял на базовом насмешке. 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? Он не должен принимать аргументы конструктора.

1 ответ

Решение

Это потому, что MockedChild является дочерним актором вашего теста. Отсутствующий аргумент конструктора является ссылкой на тест (который является родительским классом).

У вас есть три варианта:

  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
    }
  }
}
Другие вопросы по тегам