当前位置: 首页 > 知识库问答 >
问题:

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

席弘图
2023-03-14

我试图在播放框架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分为两个测试类,这两个测试类由完全相同的@Before@Before组成,我得到了实例化异常,似乎在第一个之后执行的任何类上,发生在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

我在这里遵循文档,它没有显示多个类的设置:
https://www.playframework.com/documentation/2.4.x/JavaTestingWithGuicehttps://www.playframework.com/documentation/2.4.x/JavaDependencyInjection

共有1个答案

彭高畅
2023-03-14

原因很简单,Play正在并行执行测试。为了确保它们是串行执行的,请将parallelExecution置于Global:=falsebuild中。sbt

如果不想使用全局范围,可以更改范围轴:
http://www.scala-sbt.org/0.13/docs/Scopes.html#Scoping按配置轴

因此,完全不需要以下代码:

running(application, () -> {
}

 类似资料:
  • 我将使用托管进行实时测试,但我想保护访问并防止搜索引擎索引。例如(服务器目录结构)public_html: _private _bin _cnf _log _...(更多默认目录托管) testPublic css 图像 index.html < 我想index.html是可见的每个人和所有其他目录(除了testPublic)是隐藏的,受保护的访问和搜索引擎不索引。 目录"testPublic"我

  •  什么是 Selenium?   Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个验收测试工具。据 Selenium 主页所说,与其他测试工具相比,使用 Selenium 的最大好处是:   “Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在Windows、Linux 和 MacintoshAnd 上的 Interne

  • 本文向大家介绍您如何进行功能测试?,包括了您如何进行功能测试?的使用技巧和注意事项,需要的朋友参考一下 功能测试 作为功能测试的一部分,应该对业务指定的所有用户要求进行良好的测试。功能测试要求在类似于客户要求的环境中进行测试。所有边界条件,负面情景都被考虑在内。应用程序的每个功能都应该可以很好地运行,并且不会出现任何错误。 功能测试的目的 应该测试运行良好的应用程序预期的基本要求。用户界面应易于使

  • 我正在开发一个Play(2.4版)应用程序,Guice是DI提供商。一切运行正常,但是我有一组使用ScalaTestPlus运行的功能测试,我想在测试运行时替换一些依赖项。这些测试是通过扩展类来编写的,因为它们检查我的REST API。 在测试过程中是否有其他依赖关系? 编辑:示例代码: 样品控制器: 和模块中的依赖定义: 我的测试是这样的: 我希望用其他实现取代,但只在测试中使用。

  • 我有一个服务,它接收请求,生成电子邮件,将电子邮件保存到消息队列(由其他微服务发送)并返回HttpStatus.ok。我想测试一下,对于不同的请求,一个相关的电子邮件将被生成。 在这样的功能测试中使用Pact有意义吗? 有人知道类似的用法吗? 有没有其他的技术(最好是.NET Core中的技术)可以进行类似的测试? 我也在考虑https://github.com/approvals/approva

  • 我正在尝试使用Jersey测试框架为我的REST API编写功能测试。然而,当我在功能测试中使用依赖注入时,我似乎遇到了一个障碍。我的主应用程序看起来是这样的: 是否有一种方法可以将HK2服务定位器与Jersey测试框架一起使用,或者我是否需要将我的应用程序视为外部容器并使用外部容器提供程序,如这里所述:外部容器? 此外,由于这些是功能测试,因此在这里不允许对注入的服务进行嘲弄。