gpt4 book ai didi

java - play 2 如何在测试时覆盖全局设置

转载 作者:行者123 更新时间:2023-11-28 20:02:12 25 4
gpt4 key购买 nike

我有一个要测试的 play 2.3 应用程序。此应用程序有一个扩展 GlobalSettings 的 Global.java 类,以便每 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”命令运行测试。

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

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

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

我也试过这样的:

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

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

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

围绕测试命令、它的配置、运行范围以及 fakeApplication 覆盖配置的方式和/或关于它的文档绝对不清楚和缺乏的东西肯定是奇怪的。但是,由于至少我实现了我想做的事情,我仍然认为答案已解决。

最佳答案

我按照你的要求做了。

  • 在您的 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 actor

    if (Play.application().configuration().getBoolean("startAkkaActor")) {
    //启动你的 Akka actor
    }

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

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

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

关于java - play 2 如何在测试时覆盖全局设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25481038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com