scalatest 및 mockito와 함께 BDD 방식을 사용하려고 할 때 문제가 발생했습니다. 코드 중복을 줄이기 위해 각각의 필요한 when() 규칙을 각각의 설명 블록에 넣습니다. 그러나 describe() 블록을 실행하는 방법을 명령하는 것에 놀랐습니다. 조롱 데이터가 제 설명() 블록 교체 때문에Scala FunSpec이 desribe() 초기화 및 실행 순서를 테스트합니다.
"Inside MyTest1"
"Inside MyTest2"
"Inside it 1"
"Inside it 2"
하면 I가
"Inside MyTest1"
"Inside it 1"
"Inside MyTest2"
"Inside it 2"
기대하면서 첫 번째 테스트가 실패
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") {
///
}
}
}
그것은 인쇄.
그래서 먼저 모든 설명 블록을 통과 한 다음 테스트를 실행합니다.
일부 연구를 마친 후 각 설명 블록의 순서를 유지하는 path.FunSpec
클래스를 찾았지만 BeforeAndAfter
과 같은 특성은 허용하지 않으므로 runTest()
메서드를 재정의합니다.
최소한의 코드 중복으로 이러한 테스트를 구성하는 것이 좋습니다. 그리고 나의 특별한 경우에 대한 몇 가지 권고 사항.
예제를 업데이트했습니다. 이제 공통 변수 catalogClient mock과 모든 테스트에 대한 beforeAll()의 일반적인 mock 규칙이 있습니다. > 문제를 해결하려면 각 테스트에서 조롱 된 개체의 자체 버전을 만들어야합니다. 각 특정 when() 정의를 각 테스트에 넣어야한다는 것을 의미합니까? 따라서 코드 중복이 여전히 존재합니다. – oleffir
아니요, 각 테스트마다 '모의 (mock)'호출이 필요합니다. 물론 함수를 추출 할 수는 있지만 지금은 전체 클래스에 대해 하나의 인스턴스 만 있습니다. – Kraylog