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

Unable to run play application using sbt Tests.setup for integration testing

我想 运行 我的集成测试超过 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$$anonfun$apply.apply(HikariCPModule.scala:63)

我猜这个问题与类加载 JNDI 对象有关。

你知道解决这个问题的方法吗?

好的,我找到问题了。 JNDI 使用线程的上下文 class 加载器来加载所需的 classes 但 sbt 的线程上下文 class 加载器设置不正确。所以更新下面的代码解决了我的问题;

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