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

标签 java frameworks junit playframework-2.0

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

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

我正在为一个 Play 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 框架文档:http://www.playframework.com/documentation/2.1.1/Home

您知道为什么此测试失败吗?

最佳答案

发生这种情况是因为 Play 框架中存在问题。 Play 不会增强“test”文件夹中的代码,仅增强“app”文件夹中的代码。 因此,不会生成 getter 和 setter,并且 Ebean 依赖 setter 来检测对象是否脏并支持延迟加载。这样,在您的情况下,Ebean 不知道对象上的属性已更新。

作为一个简单的解决方案,您可以自己创建 getter 和 setter。另外,这似乎已经得到解决,可能应该包含在下一个 Play 版本中: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

关于java - 为什么我的 JUnit 测试(修改数据库条目)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15862974/

相关文章:

java - 如何设置 NetBeans 引导类路径以包含 mail.jar?

java - 哪个基于 Java 的 MVC 框架与 ASP.NET MVC 最相似?

java - 验证 Junit 中 URL 的值?

java - 如何通过 Eclipse 运行 playframework FunctionalTest?

JavaFX。在哪里放置服务类引用? Controller 或主应用程序入门类(class)?

java - Java 中的 session 超时(使用 Spring Boot 和 Hazelcast)

java - 在 Java 中复制对象/数组

Java 时间节省器

frameworks - JavaScript Windows 框架

java - 在 Aspectj 中为测试套件中的每个 Junit 测试创建一个切入点