【发布时间】: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