2015-08-06 5 views
0

Я начал писать тест для актера scala. Я прочитал этот блог. http://blog.matthieuguillermin.fr/2013/06/akka-testing-your-actors/ Тогда я начал. Я написал Application Actor. Но я понял, что актер приложения, который отличается от других, находится в блоге. Потому что актер является основным классом. Он написал строку на консоли и отправил сообщение другому актеру. Как я могу протестировать приложение?Как протестировать актер - основной класс с testkit в scala

class Application extends Actor{ 

     val cliCommandExecute = context.actorOf(Props[CLICommandExecute],"CLICommandExecute") 
     println(Util.welcomeMessage) 
     cliCommandExecute ! CLICommandExecute.Listen(self) 

     def receive = { 
     case CLICommandExecute.Done(result: String) => { 
      println(result) 
      cliCommandExecute ! CLICommandExecute.Listen(self) 
     } 
     case CLICommandExecute.Failed(result: String) => { 
      println(result) 
      println(Util.failedMessage) 
      context.stop(self) 
     } 
     case CLICommandExecute.Exit => { 
      println(Util.exitMessage) 
      context.stop(self) 
     } 
     } 
    } 

Я написал ApplicationTest. Но когда я запускаю его, результаты теста не удались.

class ApplicationTest extends TestKit(ActorSystem("testSystem")) 
     with WordSpecLike 
     with Matchers { 

     "A application actor" must { 
      // Creation of the TestActorRef 
      val actorRef = TestActorRef[Application] 
      val result = "success" 
      "receive messages" in { 
      // This call is synchronous. The actor receive() method will be called in the current thread 
      actorRef ! CLICommandExecute.Done(result) 
      // This method assert that the testActorRef has received a specific message 
      expectMsg("success") 
      } 
     } 
    }  

Ошибка заключается в следующем:

assertion failed: timeout (3 seconds) during expectMsg while waiting for success 
    java.lang.AssertionError: assertion failed: timeout (3 seconds) during expectMsg while waiting for success 

Как я могу продолжить?

ответ

0

Чтобы получить сообщение от expectMsg здесь вы должны отправить ответ не cliCommandExecute, но sender:

case CLICommandExecute.Done(result: String) => { 
     println(result) 
     cliCommandExecute ! CLICommandExecute.Listen(self) 
    } 

Изменить это:

case CLICommandExecute.Done(result: String) => { 
     println(result) 
     sender() ! CLICommandExecute.Listen(self) 
} 

, и вы получите ответ через expectMsg.

Если вы хотите отправить ответ не отправитель но cliCommandExecute вы должны передать его в качестве параметра конструктора к вашему Application актеру:

class Application(cliCommandExecute: ActorRef) extends Actor { ...} 

и в тестовом проходе testActor при ее создании. Таким образом, все ответы будут направлены на testActor, и вы можете получить их через expectMsg.

+0

Благодарим вас за ответ. Но все же ошибка дана. Пожалуйста, введите команду: success [INFO] [08/06/2015 15: 40: 09.069] [testSystem-akka.actor.default-dispatcher-2] [akka: // testSystem/deadLetters] Сообщение [com.console.app.CLICommandExecute $ Listen] из TestActor [akka: // testSystem/user/$$ a] для Актера [akka: // testSystem/deadLetters] не доставлено. [1] Найдены мертвые буквы. Этот журнал может быть отключен или настроен с настройками конфигурации «akka.log-dead-letters» и «akka.log-dead-letters-while-shutdown». утверждение не выполнено: таймаут (3 секунды) во время ожиданияMsg во время ожидания успеха –

+0

обновил ответ – ka4eli

+0

В обычной программе работает так, как я хочу, путь. Но я хочу написать тест. В тесте есть ошибки –