A generic helper for database related tests with play 2 and JPA
This post is part of the archive. It was written years ago, so some of the tools, versions and links may be outdated.
All your database related unit tests for a play 2 java application have to handle the fakeApplication startup, load an fresh in memory database and load the test related fixtures. You need fixy and this helper to do the trick:
public class ModelTest {
public FakeApplication app;
public Fixy fixtures;
EntityManager em = null;
EntityTransaction tx = null;
@Before
public void beforeEachTest() {
startFakeApp();
loadFixtures();
openTransaction();
}
@After
public void afterEachTest(){
closeTransaction();
stopFakeApp();
}
// template method to load fixtures
public List< String> fixturesToLoad() { return new ArrayList< String>(); }
private void startFakeApp() {
app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
Helpers.start(app);
}
private void stopFakeApp(){
Helpers.stop(app);
}
private void openTransaction() {
em = JPA.em("default");
JPA.bindForCurrentThread(em);
tx = em.getTransaction();
tx.begin();
}
private void closeTransaction() {
if(tx != null) {
if (tx.isActive()){
if(tx.getRollbackOnly()) {
tx.rollback();
} else {
tx.commit();
}
}
}
JPA.bindForCurrentThread(null);
if(em != null) {
em.close();
}
}
private void loadFixtures() {
openTransaction();
fixtures = new JpaFixyBuilder(JPA.em()).build();
fixtures.load(addPathAndPrefix(fixturesToLoad()));
closeTransaction();
}
private static String[] addPathAndPrefix(List< String> names){
List< String> fixtureNames = new ArrayList<>();
for (String name : names){
fixtureNames.add("fixtures/" + name + ".yaml");
}
return fixtureNames.toArray(new String[0]);
}
}
To use the helper you just have to extend from ModelTest and override the fixturesToLoad method:
public class TaskTest extends ModelTest {
@Override
public List< String> fixturesToLoad() {
return Arrays.asList("tasks");
}
@Test
public void testFindByName(){
Task task = Task.findByName("Task 1");
assertEquals("Task 1", task.name);
}
}
The tasks.yaml loaded in fixturesToLoad must be placed in the conf/fixtures folder of the play application.
The source code is pushed to Play4Jpa repo on github.