我有一个我想测试的播放2.3应用程序。 此应用程序有一个Global.java类,它扩展GlobalSettings,以便每隔5分钟启动一次重复的Akka任务。
在测试期间,我不希望任务被安排,因为它会产生几个问题而我不需要它。
因此我想覆盖GlobalSettings。
通过阅读文档,看起来应该可以使用FakeApplication。但是我尝试以多种方式执行此操作,框架仍然运行我的默认全局设置。
我为我的测试创建了一个基类,如下所示:
public class BaseTest
extends WithApplication
{
protected FakeApplication provideFakeApplication()
{
return fakeApplication(inMemoryDatabase("test"), new GlobalSettings());
}
}
根据文档,如果测试类扩展WithApplication,则应该自动为我启动假应用程序,并提供配置。 无论是否发生这种情况,即使在调用测试方法之前,也会触发默认的全局设置。 “new Global()”不会覆盖默认值。
我还尝试使用@BeforeClass注释手动启动fakeApplication,但没有成功。
我正在使用“activator test”命令运行测试。
看起来falseApplication确实用于每个测试,但在第一次测试开始之前,主应用程序启动并且全局触发。这就是我不希望它发生的事情。
我做错了什么或者是游戏中的错误?如果它是一个bug,是否有解决方法?
编辑:我刚才注意到即使数据库设置也没有被正确覆盖。我通常使用h2文件数据库进行开发,但我想要一个内存,不同的用于测试。但是,通过使用上面的代码不会更改使用的数据库,因此我的测试针对我的文件DB运行。
我也试过这样的事情:
@Test
public void testMyTest()
{
running(fakeApplication(inMemoryDatabase("test2")), () -> {
//TESTING CODE THAT USES DB
});
}
并且正文中的任何查询仍然针对配置文件中配置的数据库运行,而不是内存数据库。
修改 Chafik解决方案对我有用,因为通过在build.sbt文件中指定不同的配置文件,我设法覆盖了我的设置。事情仍然非常奇怪: 1)现在,如果从我的fakeApplication构造函数中尝试通过在helper方法中传递一个新实例来覆盖GlobalSettings,则会正确覆盖设置,而在此之前我无法覆盖主要的一个 2)如果我还原我的更改并且不提供测试配置文件,我仍然可以覆盖全局设置。也就是说,行为与以前的行为不同。
测试命令,它的配置,运行范围以及fakeApplication覆盖配置的方式和/或有关它的文档肯定不清楚和缺乏,这肯定是奇怪的。然而,至少我实现了我想做的事情,我仍然会认为答案已经解决了。
答案 0 :(得分:9)
我做了你想做的事。
在build.sbt
javaOptions in Test += "-Dconfig.file=conf/application.test.conf"
创建conf/application.test.conf
include "application.conf"
startAkkaActor=true
的属性
startAkkaActor=false
的属性
更新你开始Akka演员的Global.java
if (Play.application().configuration().getBoolean("startAkkaActor")) {
// Start your Akka actor
}
您可以对数据库设置执行相同的操作
必须在build.sbt中定义配置文件,因为Play会为每个测试分叉JVM,而不会复制主JVM中设置的参数。以下不起作用:
activator test -Dconfig.file=conf/application.test.conf