阿卡的嘲笑儿童演员
Mocking child actor in Akka
我正在尝试为我的 actor 编写单元测试,但卡在基本模拟上。
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?它不应该接受任何构造函数参数。
这是因为 MockedChild 是您测试的儿童演员。缺少的构造函数参数是对测试的引用(它是父 class)。
您有三个选择:
- 将对
this
的引用传递给 Props
- 使用
Props
的命名参数形式
- 使 MockedChild 成为顶级 class(或对象的成员)
选项 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
}
}
}
我正在尝试为我的 actor 编写单元测试,但卡在基本模拟上。 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?它不应该接受任何构造函数参数。
这是因为 MockedChild 是您测试的儿童演员。缺少的构造函数参数是对测试的引用(它是父 class)。
您有三个选择:
- 将对
this
的引用传递给Props
- 使用
Props
的命名参数形式
- 使 MockedChild 成为顶级 class(或对象的成员)
选项 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
}
}
}