无法使用sbt Tests.setup运行播放应用程序进行集成测试

时间:2019-03-02 12:41:51

标签: playframework sbt integration-testing

我想在play.test.TestServer上运行集成测试。因此,所有测试都只是将Http请求发送到TestServer并声明Http结果。

但是,如果我在@BeforeClass方法测试套件中启动TestServer,则需要花费大量时间来运行所有集成测试,因为我需要为每个套件启动和停止播放服务器。

所以我决定使用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 :(得分:0)

好,我发现了问题。 JNDI使用线程的上下文类加载器加载所需的类,但是sbt的线程上下文类加载器设置不正确。因此,如下更新代码可以解决我的问题;

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