#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() } } `