【问题标题】:play 2 how to override global settings while testingplay 2 测试时如何覆盖全局设置
【发布时间】:2014-08-25 07:31:57
【问题描述】:

我有一个要测试的 play 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,但没有成功。

我正在使用“激活器测试”命令运行测试。

看起来,fakeApplication 确实用于每个测试,但在第一个测试开始之前,主应用程序已启动并全局触发。这就是我不希望发生的事情。

是我做错了什么还是游戏中的错误?如果是错误,是否有解决方法?

编辑:我刚刚注意到,即使是数据库设置也没有被正确覆盖。我通常使用 h2 文件数据库进行开发,但我想要一个内存,不同的用于测试。但是,通过使用上面的代码不会更改使用的数据库,因此我的测试针对我的文件数据库运行。

我也试过这样的:

  @Test
  public void testMyTest()
  {
    running(fakeApplication(inMemoryDatabase("test2")), () -> {
      //TESTING CODE THAT USES DB
    });
  }

并且正文中的任何查询仍然针对配置文件中配置的数据库运行,而不是内存数据库。

编辑 Chafik 解决方案对我有用,因为通过在 build.sbt 文件中指定不同的配置文件,我设法覆盖了我的设置。事情仍然很奇怪: 1)现在,如果从我的 fakeApplication 构造函数中我尝试通过在辅助方法中传递一个新实例来覆盖 GlobalSettings,则设置被正确覆盖,而在我根本无法覆盖主要设置之前 2)如果我恢复我的更改并且不提供测试配置文件,我仍然可以覆盖全局设置。也就是说,行为与最初不同。

在 test 命令、它的配置、运行范围、fakeApplication 覆盖配置的方式和/或有关它的文档方面肯定有些奇怪,而且肯定是不清楚和缺乏的。但是,由于至少我实现了我想做的事情,所以我仍然认为答案已解决。

【问题讨论】:

    标签: java testing playframework-2.3


    【解决方案1】:

    我做了你想做的事。

    • 在您的build.sbt 中设置不同的配置文件进行测试

      javaOptions in Test += "-Dconfig.file=conf/application.test.conf"

    • 创建conf/application.test.conf

    • 在开头包含主配置文件include "application.conf"
    • 覆盖所需的设置
    • 在主配置文件中创建类似startAkkaActor=true 的属性
    • 在测试配置文件中创建类似startAkkaActor=false 的属性
    • 更新你 Global.java 你开始你的 Akka 演员的地方

      if (Play.application().configuration().getBoolean("startAkkaActor")) { // Start your Akka actor }

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

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

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

    【讨论】:

    • 首先,谢谢,使用 build.sbt 中的配置文件有效。实际上,我最终只是通过在配置文件中插入“application.global=GlobalTest”来指向另一个全局类。但是我仍然不明白为什么我做错了(尤其是只是更改数据库进行测试)。我发现 play 是一个很好的框架,但肯定缺乏文档,而你拥有的文档往往是骗人的。特别是如果您对 sbt 或 scala 没有一般经验。
    • 您知道为什么我的解决方案不起作用吗?我真的希望它能够工作,尤其是第二个 sn-p 在另一个数据库上运行测试。
    • 谢谢@user1789855 - 这为我解决了这个问题。一旦我添加了一个虚拟 GlobalTest 对象并在测试配置文件中设置了“application.global=GlobalTest”,那么我的测试的假应用程序覆盖就会正确生效。
    猜你喜欢
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2018-10-20
    • 1970-01-01
    • 2011-02-25
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多