播放测试:无法连接数据库

时间:2014-02-21 14:47:51

标签: integration-testing playframework-2.2

我试图让我的测试连接到我的本地PostgreSQL:play test

@Before
public void startApp() throws Exception {
    // Set up connection to test database, different from main database. Config better
    // should be used instead of hard-coding.
    Map<String, String> settings = new HashMap<String, String>();
    settings.put("db.default.driver", "org.postgresql.Driver");
    settings.put("db.default.url", "jdbc:postgresql://localhost:5432/db_name");
    settings.put("db.default.user", "admin");
    settings.put("db.default.password", "pw");
//  settings.put("applyEvolutions.default", "true");
//  settings.put("applyDownEvolutions.default", "true");
//  settings.put("evolutionplugin", "disabled");
    app = Helpers.fakeApplication(settings);
    Helpers.start(app);
}
//
//    @After
//    public void stopApp() throws Exception {
//        Helpers.stop(app);
//    }
//


@Test
public void test() {
    running(testServer(3333, app), HTMLUNIT,
            new Callback<TestBrowser>() {
                public void invoke(TestBrowser browser) {
                    browser.goTo("http://localhost:3333");
                    browser.takeScreenShot();
                    assertThat(browser.pageSource()).contains("Login");
                }
            });
}

但是:

[error] Test test.IntegrationTest.test failed: java.lang.RuntimeException: Configuration     error: Configuration error[Cannot connect to database [default]]
[error]     at play.api.test.TestServer.start(Selenium.scala:146)
[error]     at play.test.Helpers.start(Helpers.java:401)
[error]     at play.test.Helpers.running(Helpers.java:430)
[error]     at test.IntegrationTest.test(IntegrationTest.java:46)
[error]     ...
[error] Caused by: Configuration error: Configuration error[Cannot connect to database [default]]

我的数据库开启(播放运行)

我在hashmap中的conf与application.conf中的相同

有什么想法吗? 谢谢:))

2 个答案:

答案 0 :(得分:1)

原始代码的一个问题是它显示Helpers.start(app);,但它会将app变量传递给testServer(3333, app)。创建测试服务器将启动一个全新的独立应用程序(请参阅TestApplication/framework/src/play/src/main/scala/play/core/system/ApplicationProvider.scala的scala源代码。) 因此Helpers.start(app)实际上并未启动将要使用的应用。

如果您需要执行任何特定于应用程序的初始化,该初始化将在testServer调用中持续存在,而不是使用@Before注释,则需要编写一个派生自GlobalSettings的类,覆盖onStart方法,然后使用

创建您的应用
FakeApplication app = fakeApplication(extraConfiguration, new TestGlobalSettings()); 

对于我来说,为什么在这种情况下不会与DB连接,这并不是很明显,但是当我想运行内存数据库并为测试服务器运行初始化时,这就解决了我的问题。

答案 1 :(得分:0)

没有@Before 没有修改application.conf (dev数据库),这是有效的

@Test
public void test() {
    running(fakeApplication(), new Runnable() {
        public void run() {
            Logger.debug("running");
        }
    });
}


@Test
public void testInServer() {
    running(testServer(3333), new Runnable() {
        public void run() {
            assertThat(
                    WS.url("http://localhost:3333").get().get().getStatus()
            ).isEqualTo(OK);
        }
    });
}


@Test
public void runInBrowser() {
    running(testServer(3333), HTMLUNIT, new F.Callback<TestBrowser>() {
        public void invoke(TestBrowser browser) {
//                browser.goTo("http://localhost:3333");
//                browser.$("a").click();
        }
    });
}

别忘了添加到你的appDependencies:

      "org.fluentlenium" % "fluentlenium-core" % "0.9.2"