Mongodb Scala驱动程序:如何测试错误?

时间:2016-07-17 14:17:23

标签: mongodb scala mongodb-scala

我正在使用Scala驱动程序为Mongodb(1.1.1)编写一种集成测试。

我有一个简单的插入查询,我可以使用futureobserver以这种方式管理它:

// with observer
driver.myCollection.insertOne(doc).subscribe(new Observer[Completed] {
      override def onNext(result: Completed) = /* do something */
      override def onComplete() = /* do something */
      override def onError(e: Throwable) = /* do something */
    })

// with future
val f = driver.myCollection.insertOne(doc).toFuture()
f onComplete {
      case Success(successMsg) => /* do something */
      case Failure(failureMsg) => /* do something */
    }
  }

如何在onError中的Observer和/或Failure中测试Future? 我该如何触发这种情况?

目前我正在使用Mongodb Embedded (flapdoodle)

如果我在测试开始时关闭了Mongodb,我会看到一个与该错误无关的超时。

更新

我已将WriteConcern添加到集合中:

database.getCollection(myCollection).withWriteConcern(WriteConcern.ACKNOWLEDGED)

但它并没有改变任何事情。

期货/观察者返回的错误是否包括超时错误(由于某些原因导致数据库或网络中断时引起)?

1 个答案:

答案 0 :(得分:1)

实现错误的一种方法是在集合上创建唯一索引,如下所述:https://docs.mongodb.com/manual/core/index-unique/ 如果您创建了唯一索引,则可以插入项目,然后再次尝试插入它。这样你就会收到错误。

关于你的问题,如果抛出的超时也计入onError,答案是肯定的,它是重要的。 以下是我的代码片段:

private void setUpMapIfNeeded() {
    if (map == null) {
        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }
}

在单击触发此方法调用的UI上的按钮之前,我已使用命令行命令def findByTitle(title:String)(implicit ec:ExecutionContext):Future[Option[Document]] = { val collection = db.getCollection("items") collection.find(equal("title", title)) .toFuture() .recoverWith{case e:Throwable => {println("Simulated error happened"); println(e); Future.failed(e)}} .map{seq => if(seq.isEmpty) None else Some(seq.head)} } (我在Windows上)停止了MongoDB服务。然后我触发了操作,一段时间超时触发后我在控制台中看到了这个:

net stop MongoDB

因为你可以看到超时也被处理,因为[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 Server started, use Alt+D to stop [info] play.api.Play - Application started (Dev) Simulated error happened com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoException: java.io.IOException: The remote computer refused the network connection. }, caused by {java.io.IOException: The remote computer refused the network connection. }}] [error] application - .... MongoTimeoutException