2016-06-28 3 views
1

Я новичок в scalatest и scalamock, но мне удалось написать несколько тестов. Однако, когда использование Futures в моих тестах (насмешливые результаты возврата и сами классы), тесты, похоже, не проходят.Scalatest и scalamock, тесты не проходят при использовании фьючерсов

Я написал минимальный рабочий пример, размещенный на github. Есть две ветки: «мастер» включает фьючерсы, а «withNoFutures» - нет.

Я выполнял тесты на обеих ветвях несколько раз, и тесты в «master» проходят иногда, тесты в «withNoFutures» всегда проходят. Может ли кто-нибудь помочь мне пройти тесты с прохождением фьючерсов?

Github репозиторий https://github.com/vicaba/scalatestNotWorking/tree/master

Неисправное тестирование кода выглядит следующим образом:

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 
    } 

} 

Если изменить код, чтобы возвращать только логическое значение (изменение соответствующих реализованных классов), все работает отлично. В противном случае результат undeterministic

ответ

1

Один из способов сделать так, чтобы ждать результата или готов (если функция может не), а затем запустить код (утверждать/shouldBe/и т.д.).

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)) 

Другим способом следует использовать ScalaFuture в ScalaTest 2.0 here

 Смежные вопросы

  • Нет связанных вопросов^_^