Издевательство над ребенком-актером в Акке

Я пытаюсь написать модульные тесты для своего актера и застрял в основном насмешке. PriceAggregateActor использует постоянство akka, и я не хочу передавать всю конфигурацию для него и хотел бы полностью издеваться над ним.

Это актер, которого я хочу проверить

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? Он не должен принимать никаких аргументов конструктора.


person Reeebuuk    schedule 30.07.2016    source источник


Ответы (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
    }
  }
}
person iain    schedule 30.07.2016
comment
Я понимаю, что вы говорите, но как мне написать это в коде? :) - person Reeebuuk; 31.07.2016
comment
Я добавил несколько примеров. Первоначальный ответ был сделан в аэропорту на моем телефоне. - person iain; 01.08.2016
comment
Работает как шарм! Спасибо Ян :) - person Reeebuuk; 01.08.2016