我正在使用 Akka TestKit 在 Persistent Actor 上运行测试。
我面临的一个奇怪问题是,尽管我在每次测试之前或之后清理持久性文件夹,但当我使用 sbt 运行完整的测试套件时,持久性文件夹似乎没有被删除。这是一个问题,因为从一个测试场景到下一个测试场景,都会携带持久化的数据。当下一个场景开始时,参与者从前一个场景中恢复数据,这会伪造它的测试。
仅当我使用 sbt 运行时才会发生这种情况。如果我用 Intellij 运行它,我没有问题,我的所有测试场景都运行得很好
请参阅下面我在测试中混入的 PersistenceSpec。
abstract class PersistenceSpec(system: ActorSystem) extends TestKit(system)
with ImplicitSender
with FeatureSpecLike
with Matchers
with GivenWhenThen
with BeforeAndAfterAll
with BeforeAndAfterEach
with PersistenceCleanup {
def this(name: String, config: Config) = this(ActorSystem(name, config))
override protected def beforeAll() = deleteStorageLocations()
override protected def afterAll() = {
deleteStorageLocations()
TestKit.shutdownActorSystem(system)
}
override protected def beforeEach() : Unit = {
deleteStorageLocations()
super.beforeEach()
}
override protected def afterEach(): Unit = {
super.afterEach()
deleteStorageLocations()
}
def killActors(actors: ActorRef*) = {
actors.foreach { actor =>
watch(actor)
system.stop(actor)
expectTerminated(actor)
}
}
}
trait PersistenceCleanup {
def system: ActorSystem
val storageLocations = List(
"akka.persistence.journal.leveldb.dir",
"akka.persistence.journal.leveldb-shared.store.dir",
"akka.persistence.snapshot-store.local.dir").map { s =>
new File(system.settings.config.getString(s))
}
def deleteStorageLocations(): Unit = {
storageLocations.foreach{
dir => Try(FileUtils.deleteDirectory(dir)) match {
case Success(e) => system.log.debug(s"Deleting: ${dir.getName} was a success: ${e} ")
case Failure(e) => system.log.debug(s"Deleting: ${dir.getName} was a failure: ${e} ")
}
}
}
}
对我来说,不工作的是 BeforeEach 或 AfterEach。
有什么已知问题吗?Intellij 运行没有问题不是很奇怪吗?有人对此有任何想法吗?请分享经验、解决方案或想法。