【问题标题】:ZIO Mock method that works with generics与泛型一起使用的 ZIO Mock 方法
【发布时间】:2021-01-16 11:44:13
【问题描述】:

我正在尝试模拟具有通用方法的服务,但我不知道如何在模拟中定义效果。通用效果甚至可以工作吗?有什么解决方法吗?

服务:

object AService {

  type AService = Has[Service]

  trait Service {
    def add(n1: Int, n2: Int): Task[Int]
    def foo[A](n1: A, n2: A): Task[A]
  }

  def live: ULayer[Has[Service]] = ...
}

模拟:

object AServiceMock extends Mock[AService] {

  object Add        extends Effect[(Int, Int), Nothing, Int]
  object Foo[T]     extends Effect[(T, T), Nothing, T]       // <- Can I make something like this work?

  override protected[test] val compose = ZLayer.fromService {proxy =>
    new AService.Service {
      override def add(n1: Int, n2: Int): Task[Int] = proxy(Add, n1, n2)

      override def foo[T](n1: T, n2: T): Task[T] = proxy(Foo, n1, n2)
    }
  }
}

PS:我也尝试使用@mockable[AService.Service],但我收到:“宏扩展期间出现异常:需要标识符但 $XMLSTART$

谢谢

【问题讨论】:

  • 你当然不能有类型参数化的objects。所以这个object Foo[T] extends 不起作用。

标签: scala zio zio-test


【解决方案1】:

解决了。答案在 ZIO documentation

def foo[A: zio.Tag](n1: A, n2: A): Task[A]

----------------

object AServiceMock extends Mock[AService] {

  object Add extends Effect[(Int, Int), Nothing, Int]
  object Foo extends Poly.Effect.InputOutput[Nothing]

  val compose: URLayer[Has[mock.Proxy], AService] = ZLayer.fromService { proxy =>
    new AService.Service {
      override def add(n1: Int, n2: Int): Task[Int] = proxy(Add, n1, n2)

      override def foo[A: Tag](n1: A, n2: A): Task[A] = proxy(Foo.of[(A, A), A], n1, n2)
    }
  }
}

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多