播放2如何在测试时覆盖全局设置

时间:2014-08-25 07:31:58

标签: java testing playframework-2.3

我有一个我想测试的播放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覆盖配置的方式和/或有关它的文档肯定不清楚和缺乏,这肯定是奇怪的。然而,至少我实现了我想做的事情,我仍然会认为答案已经解决了。

1 个答案:

答案 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