Java 重头戏2测试时如何覆盖全局设置
我有一个play 2.3应用程序要测试。 此应用程序有一个Global.java类,该类扩展GlobalSettings,以便每5分钟启动一次定期Akka任务 在测试期间,我不想安排任务,因为它会产生一些问题,我不需要它 因此,我希望覆盖全局设置 通过阅读文档,看起来应该可以使用伪造的应用程序来实现这一点。但是,我尝试了几种方法,框架仍然运行我的默认全局设置 我为我的测试创建了一个基类,如下所示:Java 重头戏2测试时如何覆盖全局设置,java,testing,playframework-2.3,Java,Testing,Playframework 2.3,我有一个play 2.3应用程序要测试。 此应用程序有一个Global.java类,该类扩展GlobalSettings,以便每5分钟启动一次定期Akka任务 在测试期间,我不想安排任务,因为它会产生一些问题,我不需要它 因此,我希望覆盖全局设置 通过阅读文档,看起来应该可以使用伪造的应用程序来实现这一点。但是,我尝试了几种方法,框架仍然运行我的默认全局设置 我为我的测试创建了一个基类,如下所示: public class BaseTest extends WithApplication {
public class BaseTest
extends WithApplication
{
protected FakeApplication provideFakeApplication()
{
return fakeApplication(inMemoryDatabase("test"), new GlobalSettings());
}
}
@Test
public void testMyTest()
{
running(fakeApplication(inMemoryDatabase("test2")), () -> {
//TESTING CODE THAT USES DB
});
}
根据文档,如果一个测试类扩展了应用程序,那么一个伪应用程序应该自动为我启动,并提供配置。
不管是否发生这种情况,即使在调用测试方法之前,也会触发默认全局设置。“new Global()”不会覆盖默认值
我还尝试使用@BeforeClass注释手动启动fakeApplication,但没有成功
我正在使用“activator test”命令运行测试
看起来每次测试都会使用fakeApplication,但在第一次测试开始之前,主应用程序就已经启动并触发其全局应用程序。这就是我不想发生的事
我是做错了什么,还是在玩虫子?如果是bug,是否有解决方法
编辑:我刚刚注意到,即使是数据库设置也没有被正确覆盖。我通常使用h2文件数据库进行开发,但我想要一个内存中的,用于测试的不同数据库。但是,使用上面的代码不会更改所使用的数据库,因此我的测试是针对我的文件数据库运行的
我也试过这样的方法:
public class BaseTest
extends WithApplication
{
protected FakeApplication provideFakeApplication()
{
return fakeApplication(inMemoryDatabase("test"), new GlobalSettings());
}
}
@Test
public void testMyTest()
{
running(fakeApplication(inMemoryDatabase("test2")), () -> {
//TESTING CODE THAT USES DB
});
}
而且,正文中的任何查询都是针对配置文件中配置的DB运行的,而不是针对inmemory数据库
编辑
Chafik解决方案对我来说很有效,因为通过在build.sbt文件中指定不同的配置文件,我成功地覆盖了我的设置。尽管如此,事情仍然非常复杂:
1) 现在,如果从我的fakeApplication构造函数中,我试图通过在helper方法中传递一个新实例来覆盖GlobalSettings,那么设置被正确覆盖,而在此之前,我根本无法覆盖主设置
2) 如果我恢复我的更改并且不提供测试配置文件,我仍然可以覆盖globalsettings。也就是说,行为与最初不同
test命令、它的配置、运行范围和fakeApplication覆盖配置的方式,以及/或关于它的文档,都是非常奇怪的。然而,因为至少我达到了我想做的,我仍然认为答案已经解决了。
- 在
build.sbt
Test+=“中的javaOptions-Dconfig.file=conf/application.Test.conf”
- 创建
conf/application.test.conf
- 在开头包括主配置文件
包括“application.conf”
- 覆盖所需的设置
- 在主配置文件中创建如下属性
startAkkaActor=true
- 在测试配置文件中创建如下属性
startAkkaActor=false
- 更新您启动Akka actor的位置
if(Play.application().configuration().getBoolean(“startAkkaActor”)){ //开始你的阿克卡演员 }
- 您可以对数据库设置执行相同的操作
activator test -Dconfig.file=conf/application.test.conf
首先,谢谢,在build.sbt中使用配置文件是有效的。实际上,我只是通过在配置文件中插入“application.Global=GlobalTest”来指向另一个全局类。然而,我仍然不明白为什么我所做的是错误的(尤其是为了测试而更改数据库)。我发现play是一个很好的框架,但肯定缺乏文档,而且您的文档常常是骗人的。特别是如果您一般没有sbt或scala方面的经验,您知道我的解决方案不起作用的原因吗?我真的希望它能工作,特别是第二个代码段在另一个db上运行测试。谢谢@user1789855-这为我解决了这个问题。一旦我添加了一个虚拟的GlobalTest对象,并在测试配置文件中设置了“application.global=GlobalTest”,那么我的测试的虚拟应用程序覆盖就会正确生效。