Play 2.4: Как отключить загрузку файлов маршрутов во время юнит-тестов?
Предыстория: я использую Play 2.4 (Java) с InjectedRoutesGenerator и модулем Guice для настройки различных зависимостей. Но во время модульных тестов FakeApplication пытается загрузить все контроллеры из файла маршрутов через инжектор, и некоторые из них дают сбой из-за внешних зависимостей, недоступных в среде модульного тестирования.
Как отключить обработку файлов маршрутов по умолчанию во время модульных тестов, которые выходят из play.test.WithApplication? Или как я могу заменить маршруты по умолчанию на файл пользовательских маршрутов?
Я попытался использовать переопределение параметра конфигурации play.http.router, на которое есть ссылка, но я получаю Router not found
ошибка с чем-либо, что я пытался. Очевидно, что я делаю какую-то ошибку, я не уверен, где.
Я не совсем понимаю связь между my.application.Router и conf / my.application.routes, на которые ссылается ссылка на конфигурацию. Файлы маршрутов кроме routes
не скомпилировать тоже.
1 ответ
Я отвечаю на свой вопрос здесь. Потратив немного больше времени с исходным кодом Play, я выяснил связь между файлом маршрутов и сгенерированным классом Router. Надеюсь, это поможет кому-то еще.
Задача компилятора маршрута Play компилирует все файлы в conf
папка заканчивается на .routes
а также по умолчанию routes
файл. Имя сгенерированного класса всегда Routes
, но имя пакета зависит от имени файла. Если имя файла routes
(файл маршрутов по умолчанию), скомпилированный класс помещается в router
пакет, поэтому полное имя класса router.Routes
(которое является значением по умолчанию для play.http.router
).
Для всех других файлов маршрутов RouteCompiler получает имя пакета, удаляя .routes
из имени файла. Таким образом, для my.test.routes
, play.http.router
значение должно быть my.test.Routes
,
Вот базовый класс для моих тестов с настраиваемыми элементами конфигурации маршрутизатора и БД.
public class MyTestBase extends WithApplication {
@Override
protected Application provideApplication() {
Application application = new GuiceApplicationBuilder()
.configure("db.default.driver", "org.h2.Driver")
.configure("db.default.url", "jdbc:h2:mem:play")
.configure("play.http.router", "my.test.Routes")
.build();
return application;
}
}
Если вы хотите просто не загружать маршруты, вот trait
вы можете добавить его в свой тестовый класс, если используете Scala, Guice
а также ScalaTest
. Это работает с Play 2.5. Я также показал, как можно отключить фильтры, поскольку они связаны с маршрутизацией.
Я знаю, что это немного отличается от вопроса о Java и Play 2.4, но это может быть полезно для людей, когда я дошел до этого вопроса, пытаясь достичь чего-то очень похожего.
trait DisabledRouting extends PlaySpec with OneAppPerSuite {
override def fakeApplication(): Application = {
configureApplication(new GuiceApplicationBuilder()
.router(Router.empty)
.configure("play.http.filters" -> "play.api.http.NoHttpFilters"))
.build()
}
/** Override to add additional configuration on top of disabled routing */
def configureApplication(appBuilder: GuiceApplicationBuilder): GuiceApplicationBuilder = appBuilder
}