【问题标题】:Tests pass with Playframework 1.2.x but fails with Playframework 1.4.xPlay Framework 1.2.x 测试通过,但 Play Framework 1.4.x 测试失败
【发布时间】:2016-11-18 22:35:59
【问题描述】:

我正在将我的应用程序从 Play1.2+Java7 迁移到 Play1.4+Java8

Play1.2+Java7我的测试通过了 Play1.4+Java8 我的测试失败了。

我已将代码减少到最少并重现了该问题。这是主线

模型是

package models;

import play.db.jpa.Model;

import javax.persistence.Entity;

@Entity
public class Token extends Model {

    public String name;
    public String role;
}

控制器是

package controllers;

import models.Token;
import play.mvc.Controller;

public class Application extends Controller {

    public static void index() {
        renderJSON(Token.all().fetch());
    }

}

DB测试配置是

%test.application.mode=dev
%test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0
%test.jpa.ddl=create

测试是

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.*;
import org.junit.Before;
import play.test.*;
import play.mvc.*;
import play.mvc.Http.*;
import models.*;

public class ApplicationTest extends FunctionalTest {

    @Before
    public void before() {
        Token.deleteAll();
    }

    @Test
    public void testThatIndexPageWorks() {
        {
            Response response = GET("/");
            assertIsOk(response);
            String content = getContent(response);
            System.out.println(content);
            assertFalse(content.contains("le nom"));
            assertFalse(content.contains("identifier"));
        }
        Token t = new Token();
        t.name="le nom";
        t.role="identifier";
        t.save();
        {
            Response response = GET("/");
            assertIsOk(response);
            String content = getContent(response);
            System.out.println(content);
            assertTrue(content.contains("le nom"));
            assertTrue(content.contains("identifier"));
        }
    }

}

这种行为是不可预测的。似乎在测试中保存实体是异步提交的,并且调用控制器取决于线程,而在 1.2 版中则没有

如有需要,我可以提供整个项目

【问题讨论】:

    标签: playframework-1.x


    【解决方案1】:

    由于我不想使用固定装置,我必须手动同步数据库:model.save() 的测试调用是在本地事务中完成的。调用 GET 时事务不会关闭。数据尚未刷新。

    我以为它被覆盖了 jpa FlushModeType COMMIT

    好像1.2.x是这样,1.4.x不是这样

    我修改了测试,在save()deleteAll()之后添加了下面的代码sn-p,效果很好

        if ( play.db.jpa.JPA.em().getTransaction().isActive()) {
            play.db.jpa.JPA.em().getTransaction().commit();
            play.db.jpa.JPA.em().getTransaction().begin();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 2015-12-16
      • 2017-08-25
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多