为什么我的JUnit测试(修改数据库条目)失败了?



编辑:将'retrieve.name == "name1"'替换为'retrieve.name.equals("name1")'.

EDIT2:增加了@BeforeClass和@AfterClass (credit: http://digitalsanctum.com/2012/06/01/play-framework-2-tutorial-ebean-orm/)。

我正在为一个游戏web应用程序编写JUnit测试,由于一些奇怪的原因,我似乎无法修改数据库条目。下面是我能想到的最简单的例子来说明这个问题:

@BeforeClass
public static void setup() throws IOException {
    app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
    Helpers.start(app);
    server = Ebean.getServer("default");
    ServerConfig config = new ServerConfig();
    config.setDebugSql(true);
    ddl = new DdlGenerator((SpiEbeanServer) server, new H2Platform(), config);
    // drop
    String dropScript = ddl.generateDropDdl();
    ddl.runScript(false, dropScript);
    // create
    String createScript = ddl.generateCreateDdl();
    ddl.runScript(false, createScript);
}
@AfterClass
public static void stopApp() {
    // drop
    String dropScript = ddl.generateDropDdl();
    ddl.runScript(false, dropScript);
    Helpers.stop(app);
}
@Test
public void UserModify(){
    // create user (User extends Model)
    User user = new User();
    user.id = (long) 1;
    user.name = "name1";
    user.save();
    // modify
    user.name = "name2";
    user.update();
    user.save();
    // look-up
    User retrieve = User.find.byId((long) 1);
    assertFalse("Old name", retrieve.name.equals("name1"));
}

不用说,这应该通过,但它没有…我知道你可以使用"update()"来更改数据库字段,因为项目中的其他人说他这样使用它并且它有效。

Play Framework文档:http://www.playframework.com/documentation/2.1.1/Home

知道为什么这个测试失败了吗?

这是由于Play Framework中的一个问题。Play不会增强"测试"文件夹中的代码,只会增强"应用"文件夹中的代码。因为没有生成getter和setter, Ebean依赖于setter来检测对象是否脏,并支持延迟加载。这样,在你的例子中,Ebean不知道对象上的属性被更新了。

作为一个简单的解决方案,您可以自己创建getter和setter。此外,这似乎已经修复,可能应该包括在下一个播放版本:https://github.com/playframework/Play20/blob/master/framework/test/integrationtest-java/test/models/EbeanEnhancementTest.java

下面是一个简单的带有用户模型和工作测试的Play项目:https://github.com/pharod/so-play2-issue1

查看更多关于Play生成getter和setter的详细信息,在页面底部的"注意事项"部分:http://www.playframework.com/documentation/2.1.1/JavaEbean

正如其他人所说,您应该使用.equals()来进行字符串相等。

但是主要的问题是,要运行这种测试(访问数据库),你需要一个正在运行的应用程序。在实际运行中,可以通过运行带有测试的假应用程序来实现这一点。看看这个指南:

http://www.playframework.com/documentation/2.0/JavaTest