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

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

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

Я попытался использовать параметр конфигурации https://github.com/playframework/playframework/blob/master/templates/play-java-intro/conf/application.conf#L17, но я получаю ошибку Router not found при любых попытках. Очевидно, я делаю какую-то ошибку, я не уверен, где.

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


person bravo2    schedule 20.07.2015    source источник


Ответы (2)


Я отвечаю на свой вопрос здесь. Проведя еще некоторое время с исходным кодом 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;
    }
}
person bravo2    schedule 20.07.2015
comment
Я трачу массу времени, пока не нашел ваш пост и не смог это исправить. Вы спасли мой день, спасибо! - person Zygimantas Gatelis; 19.08.2015
comment
Я все еще не понимаю. У меня просто есть файл с маршрутами в app/conf (файл маршрутов по умолчанию). Я пробовал router.Routes, и он не найден. Я не совсем понял, на что указывает my.test. У вас есть файл с именем my.test.route? - person Aydin; 04.08.2016
comment
Да, я использовал «app/conf/my.test.routes» для своих тестов. Что вы имеете в виду под моим «Я попробовал router.Routes, и он не найден»? Если вы используете файл маршрутов по умолчанию в разделе «app/conf», вам не нужно устанавливать переменную конфигурации play.http.router. - person bravo2; 05.08.2016

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

}
person jon_wu    schedule 08.05.2019