我有一个包含 3 个测试的测试套件,例如:
val test1 = test("should do smth") {
for {
service <- ZIO.service[MyCustomService]
res <- service.doSmth
} yield assertTrue(res.isEmpty)
}.provide(MyCustomServiceImpl.layer)
val test2 = test("should do smth else") {
for {
service <- ZIO.service[MyCustomService]
res <- service.doSmthElse
} yield assertTrue(res.size == 1)
}.provide(MyCustomServiceImpl.layer)
val test3 ...
在每个测试执行期间,我都有相同的 MyCustomService 实例(因为打印哈希码在所有测试中返回相同的结果)。由于 MyCustomService 内部包含缓存,因此有时一些测试会随机失败。 ZIO 是否有 Spring 框架中的 @DirtiesContext 之类的某些方面,或者我可能使用不正确的方法编写测试?
我尝试搜索ZIO测试方面,但找不到适用的东西。目前,我在每个测试开始时使用解决方法清除缓存并使用
@@ sequential
方面。
首先,让我明确指出,您的评论是错误的:这不仅绝对没问题,而且强烈建议根据需要设计和重构您的服务,使其更易于测试,并与缓存似乎违反了单一职责原则,因此您的设计很可能会受益于评论中建议的重构。
但是要回答您原来的问题,问题似乎在于如何实现
MyCustomServiceImpl.layer
的具体方式,而您尚未展示。
我尝试像这样重现你的问题:
object ZIOFooSpec extends ZIOSpecDefault {
class Foo() { def identify = hashCode.toString }
object Foo { val layer = ZIOLayer.succeed(new Foo()) }
val t = test("Foo")(
ZIO.serviceWithZIO[Foo](s => ZIO.log(s.identify)).map(_ => assertTrue(true))
).provide(Foo.layer)
override def spec = suite(t, t, t) @@ sequential
}
当我运行它时,它会打印三个不同的数字。