2016-11-17 2 views
0

ich meine Bewerbung Play1.2+Java7-Play1.4+Java8Tests passieren mit Playframework 1.2.x doch irgendwie Playframework 1.4.x

Play1.2+Java7 mein Test bestanden OK Play1.4+Java8 mein Test nicht am migrieren.

Ich habe den Code auf das Minimum reduziert und reproduziert das Problem. Hier ist die Hauptlinie

Das Modell ist

package models; 

import play.db.jpa.Model; 

import javax.persistence.Entity; 

@Entity 
public class Token extends Model { 

    public String name; 
    public String role; 
} 

Der Controller ist

package controllers; 

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

public class Application extends Controller { 

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

} 

Die DB Testkonfiguration ist

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

Der Test ist

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

} 

Das Verhalten ist nicht vorhersehbar. Es scheint, dass Spar Einheiten in den Tests verpflichtet sind async und hängt von den Fäden des Controllers aufrufen, während sie nicht in Release tat 1.2

ich das ganze Projekt zur Verfügung stellen kann, wenn nötig

Antwort

0

Wie ich das nicht verwenden möchten Fixtures, ich muss die DB manuell synchronisieren: Testanruf von model.save() erfolgt innerhalb einer lokalen Transaktion. Die Transaktion wird nicht geschlossen, wenn GET aufgerufen wird. Die Daten sind noch nicht gelöscht.

Ich dachte, dass es durch jpa FlushModeType COMMIT

bedeckt Es scheint, dass es der Fall in 1.2.x ist, aber nicht der Fall in 1.4.x

ich den Test Sie den Code-Snippet geändert nach save() und deleteAll(), und es funktioniert gut

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