Scala:对异步调用的方法进行单元测试并返回Future

时间:2015-03-07 00:40:02

标签: scala scalatest

我有一个Scala方法,内容如下:

    def doAnAsynchOperation(bunchedFilesUnit:BunchOfFilesUnit):
          Future[FilesHandled] = {

          val  handleFuture = future {
              BunchOfFilesUnit.unit.map(file => { 
             //FileParsing code - instantiate a class for file parsing
             //Open a fileInputStream
             //get an OutputStream
            try {
                //do some parsing, pass in a "file" invoke a parsing method
            } catch {
             case e:Throwable =>
            //some code
            } finally {
               fileInputStream.close()
              outStream.close()
            }
         })
    }

我在单元测试中用“描述”编写这个方法,在其中,我将会有一个“它”。

有5个主题。每个线程都被分配了处理单个BunchedFileUnit的任务。

这5个线程异步调用doAnAsynchOperation方法 - 每个都自己 - 来处理它们自己的BunchedFileUnit,这个方法返回一个Future [BunchedFileUnit]。

我想要完成的是:

我想编写一个或多个测试来测试这个场景。我想加入暂停。

我不太清楚这里的超时概念,但我假设我必须设置超时并预期TimeOutException。我怎样才能为这种场景布置测试?这就是我想要完成的。

目前,我正按以下方式进行测试:

    import org.scalatest._
    import org.scalatest.concurrent.ScalaFutures
    import scala.concurrent.{Await, ExecutionContext, duration, Future}
    import duration._
    import akka.actor.{Actor, ActorRef, ActorSystem}
    import org.scalatest.MustMatchers
    import java.io.File

    class FileHandlerTest  extends FunSpec
          with MustMatchers
          with ScalaFutures
          with BeforeAndAfter with SomeTraitThatINeeed   {

         describe("------------"){

         }

    }

1 个答案:

答案 0 :(得分:0)

我会走出困境,猜猜你正在寻找“whenReady”助手。我看到你已经导入了ScalaFutures,所以你在你的例子中做了类似的事情:

val files = Seq(...)    
whenReady(doAnAsynchOperation(files), timeout(Span(6, Seconds))) { result =>
  result mustEqual "the correct value"
}

如果您正在尝试测试失败情况,您可以尝试给它一个非常短暂的超时,但我不确定除了确保它不会完成太快或花费太长时间后会做什么。< / p>