我想在play.test.TestServer上运行我的集成测试。因此,所有测试都只是向TestServer发送Http请求并声明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对象有关。
你知道克服这个问题的任何想法吗?
好的我发现了问题。 JNDI使用线程的上下文类加载器来加载所需的类,但sbt的线程上下文类加载器未正确设置。所以更新下面的代码解决了我的问题;
Tests.Setup(loader=>{
Thread.currentThread().setContextClassLoader(loader)
loader.loadClass("it.PlayTestRunner")
.getMethod("startup")
.invoke(null)
})