Насмешливый ребенок актера в Акке
Я пытаюсь написать юнит-тесты для моего актера, и я застрял на базовом насмешке. 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 является дочерним актором вашего теста. Отсутствующий аргумент конструктора является ссылкой на тест (который является родительским классом).
У вас есть три варианта:
- Передайте ссылку на
this
вProps
- Используйте форму именованного параметра
Props
- Сделать 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
}
}
}