使用 spring 测试 playframework 2.4-从 Eclipse Scala IDE 注入数据
Testing playframework 2.4 with spring-data injection out of Eclipse Scala IDE
我想学习并尝试使用
建立一个项目
- 玩框架2.4
- JAVA
- Spring数据
- 日食IDE
我从
拿了'my inspiration'
- play-scala-spring-data-jpa 显示如何通过 guice 加载 spring 数据。
- multiproject 显示子项目配置(因为我想使用至少两个具有公共代码库的应用程序,但应该单独打包,以便能够部署到不同的机器)
我成功地 activator run
我的第一个子项目,它是 play-scala-spring-data-jpa 的 JAVA 端口。来自 spring 数据的注入魔法适用于所提供的示例 (models.PersonRepository
)。
现在我在测试方面遇到了困难。当我想加载和测试控制器 class(例如 controllers.Application
的功能测试)时,我无法设置测试 class 并注入 models.PersonRepository
, 但仅当 运行 我的子项目 core 的测试来自 Eclipse IDE (core是执行activator eclipse
)创建的eclipse工程。执行 activator test
有效,下面显示的测试成功运行。
public class ApplicationTest extends WithApplication {
@Inject private PersonRepository repo;
@Inject Application application;
@Before
public void setup() {
// Here supposes to happen more to make PersonRepository injection work when running JUnit tests out of Eclipse IDE
GuiceApplicationBuilder builder = new GuiceApplicationLoader()
.builder(new Context(Environment.simple()));
Guice.createInjector(builder.applicationModule()).injectMembers(this);
}
@After
public void teardown() {
Helpers.stop(application);
}
@Test
public void testInjection() {
assertNotNull(repo);
}
虽然我正在研究 playframework 手册 (starting here) 中与测试相关的页面,但我找不到任何有用的东西。
当我在 Eclipse 外测试时收到该错误 IDE,
com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for models.PersonRepository was bound.
while locating models.PersonRepository
for field at core.ApplicationTest.repo(ApplicationTest.java:32)
while locating core.ApplicationTest
所以我认为问题是,我必须引用我的子项目的应用程序配置 (core/conf/core-application.conf
),它为我的子项目启用了 Guice Spring 模块。其次,我必须确保 configs.AppConfig
已正确加载,因为此 class 管理 spring 数据配置。
由于我对这一切完全陌生,也许有人可以帮助我,展示
- 在 运行 脱离 Eclipse IDE(Scala IDE 插件)
时,如何使我的测试也能正常工作
- 如何强制提供的测试 class 使用专用的内存测试数据库(不一定使用为我的子项目
core/conf/META-INF/persistence.xml
定义的数据库)。
完整源代码here
编辑
我发现,当从 Eclipse IDE 而不是 activator test
使用 JUnit 测试时,classpath 不同,所以我认为这就是注入不起作用的原因。
# Classpath output was sorted before
$ diff activatorCP eclipseCP
0a1
>
88,89d88
< /h/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.6.jar
< /h/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.6.jar
130,136c129,131
< /h/.sbt/boot/scala-2.10.5/org.scala-sbt/sbt/0.13.9/test-agent-0.13.9.jar
< /h/.sbt/boot/scala-2.10.5/org.scala-sbt/sbt/0.13.9/test-interface-1.0.jar
< /h/workspace/springtest/core/target/scala-2.11/classes/
< /h/workspace/springtest/core/target/scala-2.11/test-classes/
< /h/workspace/springtest/core/target/web/classes/main/
< /h/workspace/springtest/core/target/web/classes/test
< /h/workspace/springtest/core/target/web/public/test/
---
> /h/workspace/springtest/core/bin/
> /opt/eclipse-mars/configuration/org.eclipse.osgi/213/0/.cp/
> /opt/eclipse-mars/configuration/org.eclipse.osgi/214/0/.cp/
因为我已经使用 activator compile eclipse
创建了 eclipse 的项目,所以我想知道我还需要做什么才能获得匹配的 class 路径
行为上的差异来自自定义项目 build.sbt
中的 JAVA 选项,允许 activator test
正确地 运行。这些定制必须手动转移到 eclipse 项目的 运行 配置 。之后,测试出 eclipse IDE 也 运行,成功。
我想学习并尝试使用
建立一个项目- 玩框架2.4
- JAVA
- Spring数据
- 日食IDE
我从
拿了'my inspiration'- play-scala-spring-data-jpa 显示如何通过 guice 加载 spring 数据。
- multiproject 显示子项目配置(因为我想使用至少两个具有公共代码库的应用程序,但应该单独打包,以便能够部署到不同的机器)
我成功地 activator run
我的第一个子项目,它是 play-scala-spring-data-jpa 的 JAVA 端口。来自 spring 数据的注入魔法适用于所提供的示例 (models.PersonRepository
)。
现在我在测试方面遇到了困难。当我想加载和测试控制器 class(例如 controllers.Application
的功能测试)时,我无法设置测试 class 并注入 models.PersonRepository
, 但仅当 运行 我的子项目 core 的测试来自 Eclipse IDE (core是执行activator eclipse
)创建的eclipse工程。执行 activator test
有效,下面显示的测试成功运行。
public class ApplicationTest extends WithApplication {
@Inject private PersonRepository repo;
@Inject Application application;
@Before
public void setup() {
// Here supposes to happen more to make PersonRepository injection work when running JUnit tests out of Eclipse IDE
GuiceApplicationBuilder builder = new GuiceApplicationLoader()
.builder(new Context(Environment.simple()));
Guice.createInjector(builder.applicationModule()).injectMembers(this);
}
@After
public void teardown() {
Helpers.stop(application);
}
@Test
public void testInjection() {
assertNotNull(repo);
}
虽然我正在研究 playframework 手册 (starting here) 中与测试相关的页面,但我找不到任何有用的东西。
当我在 Eclipse 外测试时收到该错误 IDE,
com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for models.PersonRepository was bound.
while locating models.PersonRepository
for field at core.ApplicationTest.repo(ApplicationTest.java:32)
while locating core.ApplicationTest
所以我认为问题是,我必须引用我的子项目的应用程序配置 (core/conf/core-application.conf
),它为我的子项目启用了 Guice Spring 模块。其次,我必须确保 configs.AppConfig
已正确加载,因为此 class 管理 spring 数据配置。
由于我对这一切完全陌生,也许有人可以帮助我,展示
- 在 运行 脱离 Eclipse IDE(Scala IDE 插件) 时,如何使我的测试也能正常工作
- 如何强制提供的测试 class 使用专用的内存测试数据库(不一定使用为我的子项目
core/conf/META-INF/persistence.xml
定义的数据库)。
完整源代码here
编辑
我发现,当从 Eclipse IDE 而不是 activator test
使用 JUnit 测试时,classpath 不同,所以我认为这就是注入不起作用的原因。
# Classpath output was sorted before
$ diff activatorCP eclipseCP
0a1
>
88,89d88
< /h/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.6.jar
< /h/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.11.6.jar
130,136c129,131
< /h/.sbt/boot/scala-2.10.5/org.scala-sbt/sbt/0.13.9/test-agent-0.13.9.jar
< /h/.sbt/boot/scala-2.10.5/org.scala-sbt/sbt/0.13.9/test-interface-1.0.jar
< /h/workspace/springtest/core/target/scala-2.11/classes/
< /h/workspace/springtest/core/target/scala-2.11/test-classes/
< /h/workspace/springtest/core/target/web/classes/main/
< /h/workspace/springtest/core/target/web/classes/test
< /h/workspace/springtest/core/target/web/public/test/
---
> /h/workspace/springtest/core/bin/
> /opt/eclipse-mars/configuration/org.eclipse.osgi/213/0/.cp/
> /opt/eclipse-mars/configuration/org.eclipse.osgi/214/0/.cp/
因为我已经使用 activator compile eclipse
创建了 eclipse 的项目,所以我想知道我还需要做什么才能获得匹配的 class 路径
行为上的差异来自自定义项目 build.sbt
中的 JAVA 选项,允许 activator test
正确地 运行。这些定制必须手动转移到 eclipse 项目的 运行 配置 。之后,测试出 eclipse IDE 也 运行,成功。