在从 2.3 升级到 2.4 后我遇到了同样的问题我的测试没有工作,因为我使用 Hibernate 在内存数据库中的 H2 中创建所有表,并为使用测试用例的数据准备数据库进行进化。
我的测试基地是这样的
public abstract class TestServerBase extends WithServer {
public static String H2_URL = "jdbc:h2:mem:glamazon;MODE=MySQL;REFERENTIAL_INTEGRITY=False";
public abstract String getDb();
@Override
protected FakeApplication provideFakeApplication() {
final String db = getDb();
final Map config = new HashMap();
config.put(String.format("db.%s.driver",db), "org.h2.Driver");
config.put(String.format("db.%s.url",db), H2_URL);
config.put(String.format("db.%s.user",db), "");
config.put(String.format("db.%s.password",db), "");
config.put(String.format("db.%s.jndiName",db), "DefaultDS");
return Helpers.fakeApplication(config);
}
}
自 play 2.4 以来发生了一些变化,并且在 play 演变后调用了休眠。为了解决这个问题,我在我的集成器配置中关闭了自动进化
play.evolutions.enabled=false
我想出了我的 TestServerBase 的新方法
@Before
public void runEvolutions(){
final Database db = Databases.createFrom(getDb(),"org.h2.Driver", H2_URL);
JPA.withTransaction(() ->{
Evolutions.applyEvolutions(db);
});
}
@After
public void deleteEvolutions(){
final Database db = Databases.createFrom(getDb(),"org.h2.Driver", H2_URL);
JPA.withTransaction(() ->{
Evolutions.cleanupEvolutions(db);
});
}
我不同意我们不能同时使用 Evolutions 和 Hibernate。我发现将两者都用于集成测试是一个完美的解决方案。如果您只想使用进化,问题是进化与数据库相关,因此 MySQL 进化不适用于 H2 db。第二个原因是我对不同的测试用例使用了不同的演进,我需要为每个演进复制粘贴所有带有方案的脚本。
我相信使用 Hibernate 来创建集成测试方案是完全可以的,而且 2.4 的更改是一个重大更改,应该记录在案。
这是我的存储库,其中包含 play 2.6 的工作示例,但它也应该适用于 play >= 2.4 githubrepository