Java 使用Guice进行功能测试时的实例化异常

Java 使用Guice进行功能测试时的实例化异常,java,testing,playframework,guice,Java,Testing,Playframework,Guice,我正试图在Play framework 2.4.6中对我的控制器进行Guice测试 以下代码可以正常工作: public class GeneralTest { @Inject Application application; private final AccountService accountServiceMock = mock(AccountService.class); @Before public void setup() {

我正试图在
Play framework 2.4.6
中对我的控制器进行
Guice
测试
以下代码可以正常工作:

public class GeneralTest {
    @Inject
    Application application;
    private final AccountService accountServiceMock = mock(AccountService.class);

    @Before
    public void setup() {
        Module testModule = new AbstractModule() {
            @Override
            public void configure() {
                bind(AccountService.class).toInstance(accountServiceMock);
            }
        };

        GuiceApplicationBuilder builder = new GuiceApplicationLoader()
                .builder(new ApplicationLoader.Context(Environment.simple()))
                .overrides(testModule);
        Guice.createInjector(builder.applicationModule()).injectMembers(this);

        Helpers.start(application);
    }

    @After
    public void teardown() {
        Helpers.stop(application);
    }

    @Test
    public void testLogin() throws SQLException {
        RequestBuilder request = new RequestBuilder()
                .uri(routes.LoginController.login().url());

        running(application, () -> {
            assertEquals(OK, route(request).status());
        });
    }


    @Test
    public void testCreateAccount() throws SQLException {
        RequestBuilder request = new RequestBuilder()
                .uri(routes.CreateController.createAccount().url());

        running(application, () -> {
            assertEquals(OK, route(request).status());
        });
    }   
}
然而,当我试图组织我的方法时,将
testLogin()
testCreateAccount
分为两个测试类,这两个测试类由完全相同的
@之前
@之后
组成,我得到了
实例化异常
,似乎在第一个之后执行的任何类上,发生在
RequestBuilder
的行上:

java.lang.InstantiationException: controllers.CreateController, took 2.656 sec
[error]     at java.lang.Class.newInstance(Unknown Source)
[error]     at play.api.inject.NewInstanceInjector$.instanceOf(Injector.scala:49)
[error]     at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$15$$anonfun$apply$87.apply(Routes.scala:534)
[error]     at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$15$$anonfun$apply$87.apply(Routes.scala:534)
[error]     at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:136)
[error]     at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3$$anon$1.invocation(HandlerInvoker.scala:127)
[error]     at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:70)
[error]     at play.http.DefaultHttpRequestHandler$1.call(DefaultHttpRequestHandler.java:20)
[error]     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94)
[error]     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94)
[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:40)
[error]     at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70)
[error]     at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32)
[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:94)
[error]     at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$6.apply(Action.scala:108)
[error]     at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$6.apply(Action.scala:108)
[error]     at scala.Option.getOrElse(Option.scala:121)
[error]     at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:107)
[error]     at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:96)
[error]     at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524)
[error]     at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524)
[error]     at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560)
[error]     at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560)
[error]     at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:536)
[error]     at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:536)
[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 java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source)
[error]     at java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
[error]     at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source)
[error]     at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
[error]     at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
[error] Caused by: java.lang.NoSuchMethodException: controllers.CreateController.<init>()
[error]     at java.lang.Class.getConstructor0(Unknown Source)
[error]     ... 36 more
java.lang.InstantiationException:controllers.CreateController,耗时2.656秒
java.lang.Class.newInstance处的[错误](未知源)
[错误]在play.api.inject.NewInstanceInjector$.instanceOf(Injector.scala:49)
[错误]在router.Routes$$anonfun$Routes$1$$anonfun$applyOrElse$15$$anonfun$apply$87.apply(Routes.scala:534)
[错误]在router.Routes$$anonfun$Routes$1$$anonfun$applyOrElse$15$$anonfun$apply$87.apply(Routes.scala:534)
[错误]在play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:136)
[错误]在play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3$$anon$1.调用(HandlerInvoker.scala:127)
[error]at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:70)
[error]at play.http.DefaultHttpRequestHandler$1.call(DefaultHttpRequestHandler.java:20)
[error]at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94)
[error]at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94)
[错误]位于scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
[错误]位于scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
[错误]在play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40)
[error]at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70)
在play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32)时发生[error]at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32)
[错误]位于scala.concurrent.impl.Future$.apply(Future.scala:31)
在scala.concurrent.Future$.apply处出现[错误](Future.scala:492)
[error]at play.core.j.JavaAction.apply(JavaAction.scala:94)
[错误]在play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$6.apply(Action.scala:108)
[错误]在play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$6.apply(Action.scala:108)
scala.Option.getOrElse(Option.scala:121)处的[error]
[错误]at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:107)
[error]at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:96)
[error]at play.api.libs.iteratee.iteratee$$anonfun$mapM$1.apply(iteratee.scala:524)
[error]at play.api.libs.iteratee.iteratee$$anonfun$mapM$1.apply(iteratee.scala:524)
[错误]at play.api.libs.iteratee.iteratee$$anonfun$flatMapM$1.apply(iteratee.scala:560)
[错误]at play.api.libs.iteratee.iteratee$$anonfun$flatMapM$1.apply(iteratee.scala:560)
[错误]在play.api.libs.iteratee.iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(iteratee.scala:536)
[错误]在play.api.libs.iteratee.iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(iteratee.scala:536)
[错误]位于scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
[错误]位于scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec处的[错误](未知源)
java.util.concurrent.ForkJoinTask.doExec(未知源)处的[error]
[错误]位于java.util.concurrent.ForkJoinPool$WorkQueue.runTask(未知源)
java.util.concurrent.ForkJoinPool.runWorker处的[错误](未知源)
java.util.concurrent.ForkJoinWorkerThread.run处的[错误](未知源)
[错误]由以下原因引起:java.lang.NoSuchMethodException:controllers.CreateController。()
java.lang.Class.getConstructor0处的[错误](未知源)
[错误]。。。36多
我在下面的文档中没有显示多个类的设置:

更新
原因很简单,Play并行执行测试。要确保它们是串行执行的,请将
并行执行置于全局:=false
置于
build.sbt

如果不想使用全局范围,可以更改范围轴:

然后,完全不需要以下代码:

running(application, () -> {
}

更新
原因很简单,Play并行执行测试。要确保它们是串行执行的,请将
并行执行置于全局:=false
置于
build.sbt

如果不想使用全局范围,可以更改范围轴:

然后,完全不需要以下代码:

running(application, () -> {
}