scala
import zio._
import zio.test.Assertion._
import zio.test.mock._
import zio.test._
import zio.test.mock.Expectation._
trait DatabaseService {
def getData: Task[String]
}
object MockDatabaseService extends Mock[DatabaseService] {
object GetData extends Effect[Unit, Throwable, String]
val compose: URLayer[Has[Proxy], DatabaseService] =
ZLayer.fromServiceM { proxy =>
withRuntime.as {
new DatabaseService {
def getData: Task[String] = proxy(GetData)
}
}
}
}
object MyService {
def fetchData: ZIO[Has[DatabaseService], Throwable, String] = {
for {
dbService <- ZIO.service[DatabaseService]
data <- dbService.getData
} yield data
}
}
object MyServiceSpec extends DefaultRunnableSpec {
def spec: ZSpec[Environment, Failure] =
suite("MyService")(
testM("should return data") {
val testData = "Test Data"
val mock = MockDatabaseService.GetData returns ZIO.succeed(testData)
assertM(MyService.fetchData)(equalTo(testData)).provideLayer(mock.toLayer)
}
)
}