import zio.clock.Clock
import zio.console.Console
import zio.test.mock.mockable
@mockable[Console]
trait MyApi {
def getData(id: Int): Task[String]
def saveData(data: String): Task[Unit]
}
def myFunction(id: Int, api: MyApi): Task[String] = {
for {
data <- api.getData(id)
_ <- api.saveData(data)
} yield data
}
object MyService extends MyApi {
def getData(id: Int): Task[String] = Task.succeed(s"Data for id $id")
def saveData(data: String): Task[Unit] = Task.unit
}
val testLayer = (Console.none ++ Clock.live) >>> MyApiMock.any
val testRuntime = Runtime.default
val result = testRuntime.unsafeRun(myFunction(123, MyService).provideLayer(testLayer))
assert(result == "Data for id 123")