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 是您测试的子角色。缺少的构造函数参数是对测试(它是父类)的引用。

你有三个选择:

  1. 将引用传递给thisintoProps
  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 回答