Java 重头戏2测试时如何覆盖全局设置

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 {

我有一个play 2.3应用程序要测试。 此应用程序有一个Global.java类,该类扩展GlobalSettings,以便每5分钟启动一次定期Akka任务

在测试期间,我不想安排任务,因为它会产生一些问题,我不需要它

因此,我希望覆盖全局设置

通过阅读文档,看起来应该可以使用伪造的应用程序来实现这一点。但是,我尝试了几种方法,框架仍然运行我的默认全局设置

我为我的测试创建了一个基类,如下所示:

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”)){
    //开始你的阿克卡演员
    }

  • 您可以对数据库设置执行相同的操作

配置文件必须在build.sbt中定义,因为Play为每个测试派生JVM,而不复制主JVM中设置的参数。以下操作不起作用:

activator test -Dconfig.file=conf/application.test.conf

首先,谢谢,在build.sbt中使用配置文件是有效的。实际上,我只是通过在配置文件中插入“application.Global=GlobalTest”来指向另一个全局类。然而,我仍然不明白为什么我所做的是错误的(尤其是为了测试而更改数据库)。我发现play是一个很好的框架,但肯定缺乏文档,而且您的文档常常是骗人的。特别是如果您一般没有sbt或scala方面的经验,您知道我的解决方案不起作用的原因吗?我真的希望它能工作,特别是第二个代码段在另一个db上运行测试。谢谢@user1789855-这为我解决了这个问题。一旦我添加了一个虚拟的GlobalTest对象,并在测试配置文件中设置了“application.global=GlobalTest”,那么我的测试的虚拟应用程序覆盖就会正确生效。