我在尝试使用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>
我想知道使用最少的代码重复来组织此类测试的一些好的做法。关于我的具体案例的一些建议。
答案 0 :(得分:1)
默认情况下,scalatest并行运行测试以缩短测试时间。
你遇到这个问题的事实表明你遇到了另一个问题,幸运的是偶然发现了 - 你的测试并没有被隔离。
要解决此问题,请让每个测试都创建自己的模拟对象版本。如果你想减少代码重复,scalatest有可以在每次测试之前运行代码的钩子。