我在尝试使用scalatest和mockito使用BDD方法时遇到了问题。为了减少代码重复,我将每个所需的()规则都在描述块中的每个规则中。但是我对dorcord()块运行的顺序感到惊讶。
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"
,第一个测试失败了,因为在第二个descript()块中替换了模拟的数据。
因此,它首先通过所有描述块,然后进行测试。
进行了一些研究后,我发现path.FunSpec
类可以保留每个描述块的排序,但是由于BeforeAndAfter
的覆盖方法,它不允许使用CC_2之类的特征。
我想知道一些很好的实践,以最小的代码重复组织此类测试。以及有关我的特殊情况的一些建议。
默认情况下,Scalatest并行运行测试,以使测试时间短。
您遇到这个问题的事实指出了您遇到的另一个问题,并且幸运的是偶然发现了您的测试。
解决问题,让每个测试创建自己的模拟对象的版本。如果要减少代码重复,Scalatest的挂钩可以在每个测试之前运行代码。