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

Play Framework 2.4.x -覆盖Guice绑定

毋举
2023-03-14

我有几个测试用例,有一个测试用例我想测试通知不可用。我使用了一个单独的GuiceInjectorBuilder将通知服务实例注入(覆盖)为None,而不是通常的Some(DefaultNotificationService)

class MySpec extends PlaySpec with Results with OneAppPerSuite {
  def appController = Application.instanceCache[AppController].apply(app)

  // typical case
  "cancel an order" should {
      "return HTTP OK" in {        
        val result: Future[Result] = injector.instanceOf[AppController].cancel(1).apply(FakeRequest())
        status(result) mustEqual OK
        (contentAsJson(result) \ "message").as[String] mustEqual "Order no. 1 is cancelled"
      }
    }

    // exception case 
    "cancel an order but notification service is OUT" should {
      import play.api.inject.bind

      val injector = new GuiceInjectorBuilder()
        .bindings(new MockAppModule)
        .in(Mode.Test)
        .overrides(bind[Option[NotificationService]].toInstance(None))  // usually it is configured to Some(DefaultNotificaionService)
        .injector()

      "return HTTP Multi Status" in {
        val result: Future[Result] = injector.instanceOf[AppController].update(1).apply(FakeRequest())
        status(result) mustEqual MULTI_STATUS
        (contentAsJson(result) \ "message").as[String] mustEqual "Order no. 1 is cancelled but user does not know"
      }
    }

  ...
  }    

它不起作用,因为 MockAppModule 依赖于 Play 在此测试的启动生命周期中注入的其他模块。如何加载这些 Play 默认模块,以便 MockAppModule 适用于此测试用例?有没有更好的方法可以做到这一点?谢谢

共有1个答案

方野
2023-03-14

如果要对每个测试一个应用而不是每个套件执行此操作,可以尝试像这样重写绑定(可能有与 newAppForTest() 等效的方法,每个套件使用一个应用执行此操作):

class MySpec extends PlaySpec with Results with GuiceOneAppPerTest {

implicit override def newAppForTest(testData: TestData): Application = {
    GuiceApplicationBuilder()
        .overrides(bind[Option[NotificationService]].toInstance(None))  // usually it is configured to Some(DefaultNotificaionService)
        .build()
    }
}
 类似资料:
  • 我遇到的问题与以下类型的消息有关: 因此,基本上,这是Angular JS 1.4.3前端在实际请求之前向服务器发送<code>选项 由于我无法在Angular端修复它,我认为在服务器端会很容易。会的,但我们使用Guice 4。 在 Guice 配置中,我们正确设置了 Shiro: 到目前为止一切顺利。但是现在我想在系统中打一个洞,允许< code>OPTIONS请求不被验证。我在这里发现了一个类

  • 我正在寻找一种方法来覆盖GuiceServletContextListener中与guice绑定的jersey资源。我的代码,我正在努力工作: 但不幸的是,这不起作用,虽然我不能像接口一样将jersey资源绑定到实现,但只有work。但是这样的绑定是不可能覆盖的。如果我试图用覆盖,我会收到一个错误而@Path应该是唯一的。那么我的用例有什么解决方案吗?

  • 问题内容: 昨天我接受了两个小时的技术电话面试(我通过了,woohoo!),但是我完全想出了以下有关Java动态绑定的问题。令人困惑的是,几年前我曾当过助教时曾向大学生教授这一概念,所以我给他们提供错误信息的前景有点令人不安… 这是给我的问题: 我断言输出应该是覆盖法中的两个单独的打印语句:和。后一种情况足够明显,而在前一种情况下,即使t1具有Object类型的引用,也将其实例化为Test类型,因

  • 我正在使用来自第三方系统的一组DTD。我们的目标是将XML请求(符合这些DTD的请求映射到java中,然后将XML响应发送回系统)。 DTD是一成不变的(我无法控制更改它们)。 因此,为了进行映射,我使用XMLSpy将dtd转换为XML Schemas (xsd ),然后使用XJC编译器创建Jaxb绑定类。我用的是Java 7。 问题是,DTD 实际上没有命名空间。我有20个不同的DTD。10 表

  • 我是一个尝试使用Guice的人(这里是新手!!)我的一个项目。 所以我有一个 我的实现是 我还将DataQueue接口定义为 DataQueue的实现如下 在我的AppModule.Configure方法中,我有以下代码 我的ConsumerFactory是一个带有create()方法的接口,该方法返回一个使用者 我的DataQueueFactory是一个带有create()方法的接口,该方法返回

  • 我正在尝试对涉及DStreams的Spark Streaming应用程序执行一些单元测试。 我发现下面这套很有用:StreamingSuiteBase。它包含一个名为testOperation的方法,您可以向该方法传递一个输入、一个要测试的操作和一个预期的输出。它将验证您的预期输出是否与实际输出相匹配。 我面临的问题是,在相等验证期间,我确实得到了完全相同的对象,但包装成不同的集合: 预期:列表(