embedmongo 与reactivemongo 进程不退出 [英] embedmongo with reactivemongo process does not exit

查看:54
本文介绍了embedmongo 与reactivemongo 进程不退出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 ScalaTest + embedmongo + reactmongo 进行一些测试,但我失败了.我的第一个问题是在测试 mongod 进程没有关闭后,我在控制台中显示以下消息:

I am trying to do some tests using ScalaTest + embedmongo + reactivemongo but I fail. My first problem is that after a test mongod process does not shut down, I have this message in console:

INFO: stopOrDestroyProcess: process has not exited

并且测试暂停,直到我手动终止进程.即使我的测试主体是空的,也会发生这种情况.我正在运行 Windows 8.1.

and tests are paused till I kill the process manually. That happens even if body of my test is empty. I am running windows 8.1.

另一个问题是,当我尝试使用反应式 mongo 连接到内部测试的 db 并将任何内容插入 db 时,我收到此异常:

The other issue is, that when I try to connect to db inside test using reactive mongo and insert anything to db I get this exception:

reactivemongo.core.errors.ConnectionNotInitialized: MongoError['Connection is missing metadata (like protocol version, etc.) The connection pool is probably being initialized.']

我真的不知道如何设置它.这是我的测试代码:

I have literally no idea how to set it up. Here is my test code:

package model

import com.github.simplyscala.MongoEmbedDatabase
import org.scalatest.{OptionValues, Matchers, BeforeAndAfter, FlatSpec}
import reactivemongo.api.MongoDriver
import reactivemongo.api.collections.bson.BSONCollection
import scala.concurrent.duration._
import reactivemongo.bson.BSONDocument
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await


class MongoBookingRepositoryTest extends FlatSpec
  with Matchers
  with OptionValues
  with MongoEmbedDatabase
  with BeforeAndAfter {

  "A MongoBookingRepository" should "..." in withEmbedMongoFixture(port = 12345) { mongoProps =>
    val driver = new MongoDriver
    val connection = driver.connection("localhost:12345" :: Nil)
    val db = connection("testDatabase")
    val collection = db.collection[BSONCollection]("bookings")

    val future = collection.insert(BSONDocument("a" -> 5))
    println(Await.result(future, 3.seconds))

    driver.close()
    connection.close()
  }
}

推荐答案

在 play2.4 中,我尝试了以下方法并且成功了.

In play2.4 I tried as below and it worked.

依赖:

    "org.reactivemongo" %% "play2-reactivemongo" % "0.11.7.play24",
    "org.reactivemongo" %% "reactivemongo-extensions-json" % "0.11.7.play24",
    // test
    "org.scalatest" %% "scalatest" % "2.2.4" % Test,
    "de.flapdoodle.embed" % "de.flapdoodle.embed.mongo" % "1.50.0" % Test,
    "org.mockito" % "mockito-core" % "1.10.19" % Test

TestMongoSetup:

TestMongoSetup:

import de.flapdoodle.embed.mongo.config.{Net, MongodConfigBuilder}
import de.flapdoodle.embed.mongo.distribution.Version
import de.flapdoodle.embed.mongo.{MongodStarter, MongodProcess, MongodExecutable}
import de.flapdoodle.embed.process.runtime.Network
import org.mockito.Mockito._
import play.modules.reactivemongo.ReactiveMongoApi
import reactivemongo.api.MongoConnection.ParsedURI
import reactivemongo.api.{MongoConnectionOptions, MongoDriver, MongoConnection}
import scala.concurrent.ExecutionContext


trait TestMongoSetup  {
  private var port : Int = _
  private var mongodExe: MongodExecutable = _
  private var mongodProcess: MongodProcess = _
  def start(intiAtPort: Int): Unit = {
    port=intiAtPort
    mongodExe = MongodStarter.getDefaultInstance.prepare(
      new MongodConfigBuilder()
        .version(Version.Main.V3_0)
        .net(new Net(port, Network.localhostIsIPv6()))
        .build()
    )
    mongodProcess = mongodExe.start()
  }
  def stop(): Unit = {
    mongodProcess.stop()
    mongodExe.stop()
  }
  def createConnection(): MongoConnection = {
    val driver = new MongoDriver
    driver.connection(ParsedURI(
      hosts = List(("localhost", port)),
      options = MongoConnectionOptions(),
      ignoredOptions = List.empty[String],
      db = None,
      authenticate = None
    ))
  }
  def createMockedReactiveMongoApi(dbName: String)(implicit ctx: ExecutionContext): ReactiveMongoApi = {
    val connection = createConnection()
    val db = connection(dbName)
    val api = mock(classOf[ReactiveMongoApi])
    doReturn(db).when(api).db
    doReturn(connection).when(api).connection
    api
  }
}

测试类:

import db.TestMongoSetup
import models.dao.UserDAO
import org.scalatest._
import play.modules.reactivemongo.ReactiveMongoApi
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration

class UserServiceTest extends FlatSpec with ShouldMatchers with GivenWhenThen with BeforeAndAfterAll with TestMongoSetup {  private var mockedAPI: ReactiveMongoApi = _
  var dao: UserDAO = _
  val port : Int = 12345
  override def beforeAll(): Unit = {
    start(port)
    mockedAPI = createMockedReactiveMongoApi("testDB")
    dao = new UserDAO(mockedAPI)
  }
  override def afterAll(): Unit = {
    mockedAPI.connection.actorSystem.shutdown()
    mockedAPI.connection.actorSystem.awaitTermination()
    stop()
  }
  "Check" should "check User object into DB" in {
    Given("a user info")
    val email = "xyx@abc.com"
    val pwd= "abcddd"
    When("it fetch from DB")
    val fromDBUser = Await.result(dao.fetch(email,pwd), Duration.Inf)
    Then("it should be fetched")
    fromDBUser.get.email  should equal(email)
  }
}

这篇关于embedmongo 与reactivemongo 进程不退出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆