zio-logging 在测试计划任务时的行为与 ZIO 中的 prod 不同

如何解决zio-logging 在测试计划任务时的行为与 ZIO 中的 prod 不同

我一直在测试可重复的任务。 在测试之外运行时可以正常工作,但在测试中失败。看起来 zio-logging 在测试时表现得有些不同(好像它是“阻塞”)。当我用普通的 Console 调用替换日志记录时,它可以工作,当我分叉日志记录调用时也是如此。

谁能告诉我我做错了什么或者为什么会这样?

package scheduler

import zio.clock.Clock
import zio.duration.durationInt
import zio.logging.Logging
import zio.test.Assertion.equalTo
import zio.test.environment.TestEnvironment
import zio.test.{DefaultRunnableSpec,ZSpec}
import zio.{Has,Ref,ZIO}

/*
Testing ZIO-based repeated tasks. It works fine locally,but when there is logging within the task it stops working under test.
It looks like it somehow holds execution after first iteration,because adding `fork` to logging statement within `doWorkLogging` makes test pass
*/

object SimpleSpec extends DefaultRunnableSpec {

  private val doWorkLogging = for {
    _   <- ZIO.accessM[Has[Ref[Long]]](_.get.update(_ + 1))
    Now <- zio.clock.instant
    _   <- zio.logging.log.info(s"Run $Now")
  } yield ()

  private val doWorkConsole = for {
    _   <- ZIO.accessM[Has[Ref[Long]]](_.get.update(_ + 1))
    Now <- zio.clock.instant
    _   <- zio.console.putStrLn(s"Run $Now")
  } yield ()

  private val logging = Logging.console()

  override def spec: ZSpec[Environment,Any] = suite("simple test")(
    testM("logging + delay work with Clock.live") {
      val counter = Ref.make(0L).toLayer
      val looper  = doWorkLogging *> (zio.UIO.unit.delay(2.seconds) *> doWorkLogging).forever
      (for {
        f     <- looper.fork
        _     <- zio.clock.sleep(5.seconds)
        ref   <- ZIO.service[Ref[Long]]
        count <- ref.get
        _     <- f.interrupt
      } yield zio.test.assert(count)(equalTo(3L))).provideSomeLayer(Clock.live ++ logging ++ counter)
    },// Why is this one failing with count = 1?
    testM("logging + delay don't work with TestEnvironment") {
      val counter = Ref.make(0L).toLayer
      val looper  = doWorkLogging *> (zio.UIO.unit.delay(2.seconds) *> doWorkLogging).forever
      (for {
        f     <- looper.fork
        _     <- zio.test.environment.TestClock.adjust(5.seconds)
        ref   <- ZIO.service[Ref[Long]]
        count <- ref.get
        _     <- f.interrupt
      } yield zio.test.assert(count)(equalTo(3L))).provideSomeLayer[TestEnvironment](logging ++ counter)
    },// And why this one (with logging replaced with console) works then?
    testM("console + delay work with TestEnvironment") {
      val counter = Ref.make(0L).toLayer
      val looper  = doWorkConsole *> (zio.UIO.unit.delay(2.seconds) *> doWorkConsole).forever
      (for {
        f     <- looper.fork
        _     <- zio.test.environment.TestClock.adjust(5.seconds)
        ref   <- ZIO.service[Ref[Long]]
        count <- ref.get
        _     <- f.interrupt
      } yield zio.test.assert(count)(equalTo(3L))).provideSomeLayer[TestEnvironment](logging ++ counter)
    },)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?