Play: модульный тест для метода класса контроллера с инъекциями

#java #unit-testing #junit #playframework #playframework-2.5

#java #модульное тестирование #junit #playframework #playframework-2.5

Вопрос:

Я пытаюсь написать тесты для методов класса контроллера, который содержит введенные зависимости

Это моя реализация тестового класса:

 public class MyTestClass {
   private static Application app;

   @BeforeClass
   public static void beforeTest() {
      app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
      Helpers.start(app);

      // .....
   }

   @AfterClass
   public static void afterTest() {
       Helpers.stop(app);
   }

   @Test
   public void testSomething() {

       // .....
       app.injector().instanceOf(MyController.class).processSomething();

       // Some assertions here..
   }

}
  

MyController.processSomething() метод содержит некоторую реализацию, которая включает использование введенного объекта FormFactory.

И когда я попытаюсь запустить, я получу null значение

 [error] Test MyTestClass.testSomething failed: null, took 0.137 sec
[error] Failed: Total 1, Failed 1, Errors 0, Passed 0
[error] Failed tests:
[error]         MyTestClass
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
  

Вопрос: Как мне убедиться, что тестируемый контроллер может получать свои инъекции?

Ответ №1:

Мое предложение состоит в том, чтобы вывести тестовый класс из приложения WithApplication вместо ручной обработки жизненного цикла приложения. Это будет выглядеть примерно так

 public class MyTestClass extends WithApplication {
    @Test
    public void testSomething() {
        Helpers.running(Helpers.fakeApplication(), () -> {
            // *whatever mocking*
            RequestBuilder mockActionRequest = Helpers.fakeRequest(
                                         controllers.routes.MyController.processSomething());
            Result result = Helpers.route(mockActionRequest);
            // *whatever assertions* 
       });
     }
}
  

Вы можете привести здесь больше примеров.

Комментарии:

1. Спасибо за ответ, play.api.test. Помощники действительно полезны. Если вы используете параметризованные тесты и не хотите полного запуска / выключения между ними, используйте что-то вроде этого @BeforeClass : ` import play.api.test. Тесты объектов помощников { var app: Application = _ @BeforeClass def setUpApp() { Tests.app = Helpers.baseApplicationBuilder.build() } } `