使用play2框架运行JUnit测试时出现mysql连接问题

时间:2014-05-07 10:07:01

标签: mysql unit-testing junit playframework-2.0 database-testing

我目前正在为一个播放应用程序创建JUnit测试。当我尝试使用FakeApplication时会出现问题。我在JUnit测试中创建一个,但是当测试使用fakeApplication实例时,我得到了这个:

[error] Test controllers.MyClassTest.getMyProperty failed: play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]]

这是我在JUnit测试类中的Java代码:

    ...
@BeforeClass
public static void startFakeApplication() {
    Map<String, String> settings = new HashMap<String, String>();
    settings.put("db.default.url", "jdbc:mysql://myhost/releaseDB?characterEncoding=UTF-8");
    settings.put("db.default.driver", "com.mysql.jdbc.Driver");
    settings.put("db.default.user", "release");
    settings.put("db.default.password", "release");
    settings.put("db.default.jndiName", "DefaultDS");
    Helpers.start(fakeApplication);
}
    ...

然后我的测试方法(注意虚拟运行,所以什么都不会导致任何麻烦):

    ...
public void getMyProperty() {

    Helpers.running (fakeApplication, new Runnable() {
        public void run() {
        }
    });

}
    ...

我认为问题是数据库连接问题,当然在运行模式下运行游戏时,一切都很好。如果我不使用FakeApplication那么它也没关系,但我需要它。 startFakeApplication方法中的所有数据库信息都来自conf / application.conf,因此它们是正确的。

奇怪的是,在运行测试时,我在输出屏幕中也有这一行:

[info] play - datasource [jdbc:mysql://myhost/releaseDB?characterEncoding=UTF-8] bound to JNDI as DefaultDS

我错过了重要的事情吗? THX

2 个答案:

答案 0 :(得分:0)

您是否将设置地图传递给某处的fakeApplication?类似的东西:

FakeApplication fakeApplication = fakeApplication(settings);

另一种选择是拥有单独的application-test.conf文件,并在build.sbt文件中包含以下内容:

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

答案 1 :(得分:0)

我的框架Acolyte提供了一个JDBC驱动程序&amp;专为此目的而设计的工具(模拟,测试......):http://acolyte.eu.org

它已经在一些开源项目(Anorm,Youtube Vitess,......)中使用,无论是使用vanilla Java还是使用其Scala DSL。

val jdbcUrl = "jdbc:acolyte:anything-you-want?handler=my-unique-id"

val handler = handleStatement.withQueryDetection(...).
  withQueryHandler(/* which result for which query */).
  withUpdateHandler(/* which result for which update */).

// Register prepared handler with expected ID 'my-unique-id'
acolyte.Driver.register("my-unique-id", handler);

// then ...
Connection con = DriverManager.getConnection(jdbcUrl);
// ... Connection |con| is managed through |handler|
// Or pass the JDBC url to Play config