我正在努力理解为什么我的安装拆卸程序无法按我期望的那样在ScalaTest中运行。基本上,我的测试代码如下所示:
class UserManagerTest extends FlatSpec with ManagerBehaviors[User, UserDAO] {
"An entity manager" should behave like allFindingManager(UserManager)
"An entity manager" should behave like countingManager(UserManager)
}
trait ManagerBehaviors[T <: IEntity, D <: AbstractDAO[T]] {
this: FlatSpec =>
private def withClearDB(entityManager: BasicManager[T, D], testFunction: () => Unit) = {
try {
clearDB(entityManager)
testFunction()
} finally {
clearDB(entityManager)
}
}
private def clearDB(manager: BasicManager[T, D]) = {
manager.all match {
case Some(entities) => for (entity <- entities) manager.remove(entity.getId)
}
}
def allFindingManager(manager: BasicManager[T, D]) {
withClearDB(manager,
() => it should "properly return all elements in the database for the entity" in {
// Add 10 entities to the database
for (i <- 1 to 10) manager.persist(manager.defaultEntity)
manager.all match {
case Some(entities) => assert(entities.length == 10)
case None => fail()
}
})
}
def countingManager(manager: BasicManager[T, D]) {
withClearDB(manager,
() => it should "properly count the number of entities managed" in {
// Add 10 entities to the database
for (i <- 1 to 10) manager.persist(manager.defaultEntity)
assert(manager.count == 10)
})
}
}
我期望的是以下顺序:
清除数据库
allFindingManager
清除数据库
清除数据库
计数管理器
清除数据库
当以隔离方式运行时,测试将按预期工作-启动时将清除数据库,并在测试结束时将其保留为空。
但是,在运行整个UserManagerTest类时,由于某种原因,它会失败并显示以下内容:
org.scalatest.exceptions.TestFailedException: 20 did not equal 10
这样做的原因是,某种程度上,测试是在彼此之间立即调用的,而没有间断的clearDB调用。我不知道为什么会这样。
使用调试器并在finally
块中放置断点时,可能会发现发生的情况:此块确实按预期运行了两次,但这是在执行测试方法之前发生的!全部:
清除数据库
清除数据库
清除数据库
清除数据库
allFindingManager
计数管理器
谁能帮我阐明一下吗?
如果你改变
def countingManager(manager: BasicManager[T, D]) {
withClearDB(manager,
() => it should "properly ..." in {
// Add 10 entities to the database
for (i <- 1 to 10) manager.persist(manager.defaultEntity)
assert(manager.count == 10)
})
}
到
def countingManager(manager: BasicManager[T, D]) {
it should "properly ..." in withClearDB(manager,
() => {
// Add 10 entities to the database
for (i <- 1 to 10) manager.persist(manager.defaultEntity)
assert(manager.count == 10)
}
)
}
同样在其他函数中,执行顺序将与您期望的一样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句