2016-11-17 10 views
0

Я мигрирующей мое заявление от Play1.2+Java7 к Play1.4+Java8Испытания проходят с Playframework 1.2.x, но не с Playframework 1.4.x

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()); 
    } 

} 

Тестовая конфигурация БД

%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

Я могу предоставить весь проект, если необходимый

ответ

0

Как я не хочу использовать Я должен вручную синхронизировать БД: тестовый вызов model.save() выполняется в локальной транзакции. Транзакция не закрывается при вызове GET. данные еще не очищены.

Я думал, что она была покрыта jpa FlushModeType COMMIT

кажется, что это имеет место в 1.2.x, но не случай в 1.4.x

я изменил тест, добавив фрагмент кода ниже после save() и deleteAll(), и он отлично работает

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