Невозможно запустить приложение play, используя sbt Tests.setup для тестирования интеграции - PullRequest
0 голосов
/ 02 марта 2019

Я хочу запустить свои интеграционные тесты поверх play.test.TestServer.Поэтому все тесты будут просто отправлять запросы Http в TestServer и подтверждать результаты Http.

Однако, если я запускаю TestServer в наборе тестов методов @BeforeClass, для запуска всех интеграционных тестов требуется так много времени, что мне нужнозапускать и останавливать сервер воспроизведения для каждого набора.

Поэтому я решил запустить тестовый сервер воспроизведения, используя метод sbt Tests.Setup

Tests.Setup(loader=>   
    loader.loadClass("it.PlayTestRunner")
       .getMethod("startup")
       .invoke(null)
)

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

Caused by: java.lang.ClassNotFoundException: tyrex.naming.MemoryContextFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:61)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:672)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at play.api.libs.JNDI$.initialContext$lzycompute(JNDI.scala:40)
at play.api.libs.JNDI$.initialContext(JNDI.scala:22)
at play.api.db.HikariCPConnectionPool$$anonfun$1$$anonfun$apply$2.apply(HikariCPModule.scala:63)

Я полагаю, что эта проблема связана с загрузкой классов JNDI-объектов.

Знаете ли вы какие-либо идеи по преодолению этой проблемы?

1 Ответ

0 голосов
/ 07 марта 2019

Хорошо, я нашел проблему.JNDI использует загрузчик класса контекста потока для загрузки необходимых классов, но загрузчик класса контекста потока sbt установлен неправильно.Поэтому обновление кода, как показано ниже, решило мою проблему;

Tests.Setup(loader=>{
    Thread.currentThread().setContextClassLoader(loader) 
    loader.loadClass("it.PlayTestRunner")
       .getMethod("startup")
       .invoke(null)
})
...