Scala FunSpec 测试describe() 初始化和执行顺序

标签 scala mockito bdd scalatest

当我尝试将 BDD 方法与 scalatest 和 mockito 结合使用时,我遇到了一个问题。 为了减少代码重复,我将每个所需的 when() 规则放入每个描述 block 中。但是,describe() block 的运行顺序让我感到惊讶。

class SomeTest extends FunSpec with BeforeAndAfterAll with MockitoSugar {

  private val catalogClient = mock[CatalogServiceClient]

  override def beforeAll {
      when(catalogClient.getFrame(any)).thenReturn(Frame())
  }

  describe("MyTest1") {
    println("Inside MyTest1")

    when(catalogClient.getConnection(any))
      .thenReturn(Conn(ID_FOR_TEST_1))

    it("should perform action with data ID_FOR_TEST_1") {
      println("Inside it 1")
    }

    it("should perform another action with data ID_FOR_TEST_1") {
      ///
    }

  }

  describe("MyTest2") {
    println("Inside MyTest2")

    when(catalogClient.getConnection(any))
      .thenReturn(Conn(ID_FOR_TEST_2))

    it("should perform logic with data ID_FOR_TEST_2") {
      println("Inside it 2")
    }

    it("should perform another logic with data ID_FOR_TEST_2") {
      ///
    }
  }
}

它打印:

"Inside MyTest1"
"Inside MyTest2"
"Inside it 1"
"Inside it 2"

在我期待的时候

"Inside MyTest1"
"Inside it 1"
"Inside MyTest2"
"Inside it 2"

第一个测试失败,因为模拟数据在第二个describe() block 中被替换。

因此它首先遍历所有描述 block ,然后运行测试。

经过一些研究,我发现 path.FunSpec 类可以保留每个描述 block 的顺序,但它不允许使用像 BeforeAndAfter 这样的特征,因为覆盖 runTest() 方法作为 final方法。

我想知道一些好的做法,以最少的代码重复来组织此类测试。以及一些关于我的具体案例的建议。

最佳答案

默认情况下,scalatest 并行运行测试以缩短测试时间。

您遇到这个问题的事实表明您遇到了另一个问题,并且幸运的是您偶然发现了这个问题 - 您的测试并不是孤立的。

为了解决这个问题,让每个测试创建自己的模拟对象版本。如果您想减少代码重复,scalatest 有可以在每次测试之前运行代码的钩子(Hook)。

关于Scala FunSpec 测试describe() 初始化和执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47775636/

相关文章:

带有下划线的scala传递函数产生一个函数而不是一个值

scala - 在案例类 : scala 中重载 unapply 方法

java - 用 @MockBean 模拟的 RestTemplateBuilder 为 null

php - BDD 测试有太多后台作业?

scala - 从 Scala 源生成 UML 图

sockets - Mockito thenAnswer 没有被调用

java - 无法模拟 dynamoDBMapper.query

python - 为什么这个方法被调用两次(pytest)

bdd - MSpec 和 SpecFlow 什么时候用哪个?两者的优点/缺点是什么?

java - 仅在 Spark 中可见的 Shapeless 中的 NoSuchMethodError