Test Transactional controller in Play framework 2.4+

53 views
Skip to first unread message

Amigo

unread,
Oct 13, 2016, 3:27:51 AM10/13/16
to Play Framework

Hello all.


Trying to test play controller with some db operation in it, using custom WithApplication class.

Play 2.4+ Hibernate 4.3.9

Test Code:


public class AuthTest extends WithApplication {

@Override
public void startPlay()
{

    Http.RequestBuilder request = new Http.RequestBuilder().method("POST").uri("");
    Http.Request r = request.build();
    Http.Cookie c = new Http.Cookie("application.lang.cookie","ru",null,null,null,true,true);
    request.cookie(c);

    super.startPlay();
    Http.Context.current.set(new Http.Context(1L,
            Mockito.mock(RequestHeader.class),
            r,
            Collections.<String, String>emptyMap(),
            Collections.<String, String>emptyMap(),
            Collections.<String, Object>emptyMap()));
    Http.Context.current().changeLang("en");

}

 @Override
public Application provideApplication() {
    MockitoAnnotations.initMocks(this);
    Module testModule = new AbstractModule() {
        @Override
        public void configure() {
            bind(AuthServices.class)
                    .toInstance(authServices);
        }
    };
    GuiceApplicationBuilder builder = new GuiceApplicationLoader()
            .builder(new play.ApplicationLoader.Context(Environment.simple()))
            .in(Mode.TEST)
            .overrides(testModule);
    return builder.build();
}

 @Test
public void authByLoginErrorForm() {

    Map<String, String> data = new HashMap<>();
    data.put("username", "");
    data.put("password", "");

    Http.RequestBuilder request = new Http.RequestBuilder()
            .method("POST")
            .uri("/auth/login").bodyForm(data);

    Result result = route(request, Helpers.DEFAULT_TIMEOUT);

    assertTrue("Empty login or password", contentAsString(result).contains("WP_EMPTY_FIELDS"));
    assertEquals("Form with errors must return 400 http code", 200, result.status());
}
}


[error] Test controller.AuthTest.authByLoginErrorForm failed: java.lang.IllegalStateException: Tried to remove the EntityManager, but none was set., took 0.091 sec
[error]     at play.db.jpa.JPAEntityManagerContext.pop(JPAEntityManagerContext.java:74)
[error]     at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:155)
[error]     at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:195)
[error]     at play.db.jpa.TransactionalAction.call(TransactionalAction.java:25)
[error]     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108)
[error]     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108)
[error]     at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
[error]     at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
[error]     at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56)
[error]     at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70)
[error]     at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48)
[error]     at scala.concurrent.impl.Future$.apply(Future.scala:31)
[error]     at scala.concurrent.Future$.apply(Future.scala:492)
[error]     at play.core.j.JavaAction.apply(JavaAction.scala:108)
[error]     at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:112)
[error]     at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:112)
[error]     at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
[error]     at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:111)
[error]     at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:110)
[error]     at scala.Option.map(Option.scala:146)
[error]     at play.api.mvc.Action$$anonfun$apply$2.apply(Action.scala:110)
[error]     at play.api.mvc.Action$$anonfun$apply$2.apply(Action.scala:103)
[error]     at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251)
[error]     at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:249)
[error]     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
[error]     at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
[error]     at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:91)
[error]     at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply(BatchingExecutor.scala:91)
[error]     at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply(BatchingExecutor.scala:91)
[error]     at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72)
[error]     at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:90)
[error]     at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:39)
[error]     at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:409)
[error]     at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
[error]     at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
[error]     at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
[error]     at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

Can anyone get me hints how to correct test Transactional controller on mem (h2) db?
Reply all
Reply to author
Forward
0 new messages