我正在使用Scala驱动程序为Mongodb(1.1.1)编写一种集成测试。
我有一个简单的插入查询,我可以使用future
或observer
以这种方式管理它:
// 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)
但它并没有改变任何事情。
期货/观察者返回的错误是否包括超时错误(由于某些原因导致数据库或网络中断时引起)?
答案 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
。