【问题标题】:How to inject Configuration instance to scalatest?如何将配置实例注入到scalatest?
【发布时间】:2017-02-14 14:25:40
【问题描述】:

我想在我的一个测试类中注入 Configuration 实例,我用 ConfiguredApp 扩展了我的测试类并注入了 Configuration,它看起来像这样:

@DoNotDiscover()
class MyApiServiceSpec extends FreeSpec with ScalaFutures with ConfiguredApp {

  implicit val formats = DefaultFormats

  implicit val exec = global

  lazy val configuration = app.injector.instanceOf[Configuration]

  "Global test" - {

    "testcase 1" in {

      Server.withRouter() {
        case GET(p"/get/data") => Action { request =>
          Results.Ok()
        }
      } { implicit port =>
        WsTestClient.withClient { implicit client =>
          val service = new MyApiService {
            override def config: Configuration = configuration
            override val ws: WSClient = client
          }


            whenReady(service.getData()) { res =>
//i will test stuff here
          }
        }
      }
    }
  }
}

(MyApiService is a trait)

在嵌套套件上调用 run 时遇到异常 - ConfiguredApp 需要一个与键关联的应用程序值 配置图中的“org.scalatestplus.play.app”。你忘了 使用@DoNotDiscover 注释嵌套套件? java.lang.IllegalArgumentException: ConfiguredApp 需要一个应用程序 与配置中的键“org.scalatestplus.play.app”关联的值 地图。您是否忘记使用 @DoNotDiscover 注释嵌套套件?

有人知道这是为什么...?

谢谢!333333

【问题讨论】:

标签: scala playframework playframework-2.0 guice scalatest


【解决方案1】:

我的答案不是对当前问题的回答,但我想提供一些建议。如果您想为控制器或某些服务编写单元测试,我建议使用 PlaySpec。为测试环境注入自定义配置:

class MyControllerSpec extends PlaySpec with OneAppPerSuite {

    val myConfigFile = new File("app/test/conf/application_test.conf")
    val parsedConfig = ConfigFactory.parseFile(myConfigFile)
    val configuration = ConfigFactory.load(parsedConfig)

    implicit override lazy val app: Application = new GuiceApplicationBuilder()
    .overrides(bind[Configuration].toInstance(Configuration(configuration)))
    .build()

    "MyController #index" should {
        "should be open" in {
          val result = route(app, FakeRequest(GET, controllers.routes.MyController.index().url)).get
          status(result) mustBe OK
        }
    }

}

【讨论】:

    【解决方案2】:

    您似乎试图单独运行此测试。但是对于ConfiguredApp,您必须使用套件运行此测试,例如

    class AcceptanceSpecSuite extends PlaySpec with GuiceOneAppPerSuite {
    
      override def nestedSuites = Vector(new MyApiServiceSpec)
    }
    

    注射看起来没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2020-06-02
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多