我在我的單元測驗(使用 mockito)中模擬MVar2方法make時遇到了麻煩。
我試過這個:
private val sq = mock[MVar2[IO, String]]
當我嘗試模擬該方法時:
when(sq.take).thenReturn(
"testString".pure[IO],
IO.never
)
我在測驗中得到無限回圈。
我很肯定我可以像這樣嘲笑它。
呼叫 的實際代碼make是:
def run: F[Unit] =
fs2.Stream
.repeatEval[F, String](signalQ.take)
.map(encode)
.unNone
.evalTap(logMessage)
.evalMap(send)
.compile
.drain
uj5u.com熱心網友回復:
我看到兩個問題。
首先,沒有理由嘲笑IO。你幾乎可以這樣做:
// define this wherever you create sq
val sq = MVar2[IO, String]
// then DI sq and
sq.put("testString") >> run
那么第二件事,它是如何.repeatEval(io)作業的?io每次流需要另一個元素時,它都會重復呼叫。所以一開始它會io用你的模擬來評估:
"testString".pure[IO]
它將計算第一個元素 to"testString"和以后 to
IO.never
這意味著第二個元素永遠不會出現,因為這io永遠不會回傳 - 既不是值也不是例外。正如您所見,您的流停止了。(這將根據規范,但顯然不是你想要的)。
如果您想獲取Some(string)值是否存在以及None它是否不存在(以終止流None),您應該嘗試:
def run: F[Unit] =
fs2.Stream
.repeatEval[F, Option[String]](signalQ.tryTake)// <-- try to get None on empty
.unNoneTerminate // <-- terminate on None
.map(encode)
.evalTap(logMessage)
.evalMap(send)
.compile
.drain
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381432.html
