2016-06-28 5 views
1

Ich bin neu bei Scalatest und Scalamock, aber ich habe es geschafft, einige Tests zu schreiben. Wenn jedoch Futures in meinen Tests verwendet werden (spöttische Rückmeldungen und in Klassen selbst), scheinen Tests nicht zu bestehen.Scalatest und Scalamock, Tests passieren nicht, wenn Futures beteiligt sind

Ich habe ein minimales Arbeitsbeispiel geschrieben, das auf GitHub gehostet wird. Es gibt zwei Zweige, "Master" beinhaltet Futures und "withNoFutures" nicht.

Ich habe die Tests in beiden Zweigen mehrmals durchgeführt und die Tests in "Master" bestanden manchmal die Tests in "withNoFutures" immer. Kann mir jemand helfen, die Tests mit Futures bestanden zu bekommen?

Github Repo: https://github.com/vicaba/scalatestNotWorking/tree/master

Der Fehler Test Code wie folgt aussieht:

package example 

import org.scalamock.scalatest.MockFactory 
import org.scalatest.{BeforeAndAfter, FunSuite} 

import scala.concurrent.Future 


class SomeServiceTest extends FunSuite with BeforeAndAfter with MockFactory { 

    var otherService: SomeOtherService = _ 

    var service: SomeService = _ 

    before { 
    otherService = mock[SomeOtherService] 
    service = mock[SomeService] 
    } 

    after { 
    otherService = null 
    service = null 
    } 

    test("a first test works") { 
    otherService.execute _ expects() once() 
    service.execute _ expects(*) returning Future.successful(true) once() 
    SomeService.execute(service, otherService) 
    } 


    // Why this test does not work? 
    test("a second test works") { 
    // Copy paste the code in the first test 
    } 

} 

Wenn ich den Code ändern, dass nur ein boolean zurückzukehren (die entsprechenden implementierten Klassen zu ändern), alles funktioniert gut. Ansonsten ist das Ergebnis undeterministic

Antwort

1

Der einzige Weg, dies zu tun, ist für Ergebnis warten oder bereit (falls Funktion fehlschlagen) und dann Code ausführen (behaupten/SHOULDBE/etc.)

import scala.concurrent.Await 
import scala.concurrent.duration._ 

//res0 is of type Future[T] 
val res0 = Await.ready(firstFeature, FiniteDuration(1,SECONDS)) 
//res1 is of type T (from Future[T]) 
val res1 = Await.result(secondFeature, FiniteDuration(1,SECONDS)) 

Ein anderer Weg, Verwenden Sie ScalaFuture in ScalaTest 2.0 here

Verwandte Themen