2011-11-15 69 views
2

我不断收到Playframework功能测试java.util.concurrent.TimeoutException

java.util.concurrent.TimeoutException 

运行的,自从我迁移到Postgres的从MEM分贝我的功能测试时。

Http.Response response = GET("/services/names/"); 
    assertIsOk(response); 

完整的错误消息

java.lang.RuntimeException: java.util.concurrent.TimeoutException 
    at play.test.FunctionalTest.makeRequest(FunctionalTest.java:291) 
    at play.test.FunctionalTest.makeRequest(FunctionalTest.java:297) 
    at play.test.FunctionalTest.GET(FunctionalTest.java:100) 
    at play.test.FunctionalTest.GET(FunctionalTest.java:54) 
    at controllers.ImagesTest.shouldReturnListOfImages(ImagesTest.java:25) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at play.test.PlayJUnitRunner$StartPlay$2$1.evaluate(PlayJUnitRunner.java:98) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at play.test.PlayJUnitRunner.run(PlayJUnitRunner.java:48) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:24) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:136) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:117) 
    at play.test.TestEngine.run(TestEngine.java:101) 
    at controllers.TestRunner.run(TestRunner.java:67) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:546) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:500) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:471) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:159) 
    at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:220) 
    at play.Invoker$Invocation.run(Invoker.java:265) 
    at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:200) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.util.concurrent.TimeoutException 
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:91) 
    at play.test.FunctionalTest.makeRequest(FunctionalTest.java:278) 
+0

你在做什么“/ services/name”调用?从mem db移动到PostgreSQL不应该破坏测试本身,除非你的模型不是PostgreSQL兼容的(使用保留关键字等),在这种情况下,这个错误可能掩盖了真正的问题 –

回答

0

你可能需要增加你的线程池的大小。默认情况下,测试在DEV模式下运行,并DEV模式有1.看的线程池大小此行您application.conf

play.pool = 1

看看是否增加该值将帮帮我。

+0

不工作:( – lemon

1

对于每个请求 (参见Play 1.2.3中的FunctionalTest.java:278),功能测试的内置超时为30秒硬编码。也许你的测试在postgres上持续那么久?

1

您遇到了一个死锁:测试运行的事务和运行该事件的事务正如1.2 release notes中所解释的那样发生混淆。不幸的是,这是因为即使你指定它使用SET TRANSACTION不能使用PostgreSQL中READ UNCOMMITED隔离级别,the transaction isolation level will still be READ COMMITTED

你可以做的是,确保在测试代码中的交易在操作交易之前犯下的测试代码调用启动。例如

@Test 
public void testSomething() { 
    Fixtures.loadModels("models.yml"); 
    JPA.em().getTransaction().commit(); 

    // Call a controller 
} 

另一种方法是使用内存数据库运行测试。