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

时间:2017-12-12 15:01:32

标签: scala mockito bdd scalatest

我在尝试使用scalatest和mockito的BDD方法时遇到了问题。 为了减少代码重复,我将每个需要的when()规则放在每个describe块中。但是对于如何运行describe()块令我感到惊讶。

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()块中替换了模拟数据。

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

经过一番研究后,我发现path.FunSpec类保留了每个描述块的排序,但它不允许使用像BeforeAndAfter这样的特征,因为重写runTest()方法是最终的。< / p>

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

1 个答案:

答案 0 :(得分:1)

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

你遇到这个问题的事实表明你遇到了另一个问题,幸运的是偶然发现了 - 你的测试并没有被隔离。

要解决此问题,请让每个测试都创建自己的模拟对象版本。如果你想减少代码重复,scalatest有可以在每次测试之前运行代码的钩子。