2017-12-12 25 views
1

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() 메서드를 재정의합니다.

최소한의 코드 중복으로 이러한 테스트를 구성하는 것이 좋습니다. 그리고 나의 특별한 경우에 대한 몇 가지 권고 사항.

답변

1

기본적으로 scalatest는 병렬로 테스트를 실행하여 테스트 시간을 줄입니다.

이 문제는 가지고있는 다른 문제를 지적하고 운 좋게도 우연히 만났습니다. 테스트는 격리되지 않습니다.

문제를 해결하려면 각 테스트에서 조롱 된 개체의 자체 버전을 만들어야합니다. 코드 중복을 줄이려면 모든 테스트 전에 코드를 실행할 수있는 후크가 있어야합니다.

+0

예제를 업데이트했습니다. 이제 공통 변수 catalogClient mock과 모든 테스트에 대한 beforeAll()의 일반적인 mock 규칙이 있습니다. > 문제를 해결하려면 각 테스트에서 조롱 된 개체의 자체 버전을 만들어야합니다. 각 특정 when() 정의를 각 테스트에 넣어야한다는 것을 의미합니까? 따라서 코드 중복이 여전히 존재합니다. – oleffir

+0

아니요, 각 테스트마다 '모의 (mock)'호출이 필요합니다. 물론 함수를 추출 할 수는 있지만 지금은 전체 클래스에 대해 하나의 인스턴스 만 있습니다. – Kraylog