Play 2.4: Как отключить загрузку файлов маршрута во время модульных тестов?

Фон. Я использую Play 2.4 (Java) с InjectedRoutesGenerator и модуль Guice для настройки различных зависимостей. Но во время модульных тестов FakeApplication пытается загрузить все контроллеры из файла маршрутов через инжектор, а некоторые из них не работают из-за внешних зависимостей, недоступных в среде unit test.

Как отключить обработку файлов маршрутов по умолчанию во время модульных тестов, которые простираются от play.test.WithApplication? Или как я могу заменить маршруты по умолчанию с помощью файла настраиваемых маршрутов?

Я попытался использовать опцию play.http.router config переопределить ссылку здесь, но я получаю ошибку Router not found с чем-либо, что я пробовал. Очевидно, я ошибаюсь, я не знаю, где.

Я не совсем понимаю связь между my.application.Router и conf/my.application.routes, на которые ссылается ссылка config. Файлы маршрутов, отличные от routes, также не компилируются.

Ответ 1

Я отвечаю на свой вопрос здесь. Проведя еще некоторое время с исходным кодом Play, я выяснил связь между файлом маршрутов и сгенерированным классом Router. Надеюсь, это поможет кому-то другому.

Задача компилятора Play route компилирует все файлы в папке conf, заканчивающиеся на .routes, а также файл routes по умолчанию. Имя генерируемого класса всегда routes, но имя пакета зависит от имени файла. Если имя файла routes (файл маршрутов по умолчанию), скомпилированный класс помещается в пакет router, поэтому полное имя класса router.Routes (которое является значением по умолчанию для play.http.router).

Для всех других файлов маршрутов RouteCompiler получает имя пакета, отбрасывая .routes из имени файла. Поэтому для my.test.routes значение play.http.router должно быть my.test.routes.

Вот базовый класс для моих тестов с настраиваемыми элементами конфигурации маршрутизатора и db.

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;
    }
}

Ответ 2

Если вы хотите просто не загружать маршруты вообще, вот 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

}