2016-08-29 2 views
0

암시 적 가져 오기가 왜 scalatest에서 예상대로 작동하지 않는지 이해하는 데 어려움을 겪고 있습니다.scalatest에서 암시 적 메서드 가져 오기

class FailingSpec extends FlatSpec with Matchers with MySparkContext { 

    val testSqlctx = sqlctx 
    import sqlctx.implicits._ 

    "sql context implicts" should "work" in { 
     val failingDf = Seq(ID(1)).toDS.toDF 
    } 
} 

MySparkContext의 특성이 만들어 beforeAllafterAll에서 스파크 컨텍스트를 파괴하고 사용할 수 sqlctx (이미하게 다음과 같이 단순화 실패 예 (스파크를 사용하지만 그것은 또한 내 사용자 정의 클래스와 함께 실패 할 수 있습니다)입니다 implicits를 가져 오기 위해 지역 변수에 재 할당해야하는 것은 퍼즐이지만, 아마도 다른 시간에). .toDS.toDFsqlctx.implicits에서 가져온 내재적 메서드입니다. 테스트를 실행하면 java.lang.NullPointerException이됩니다.

내가 테스트 블록 것들로 가져 오기를 이동하면 작동 :

class WorkingSpec extends FlatSpec with Matchers with MySparkContext { 

    "sql context implicts" should "work" in {  
     val testSqlctx = sqlctx 
     import sqlctx.implicits._ 

     val workingDf = Seq(ID(1)).toDS.toDF 
    } 
} 

내가 테스트 클래스의 최상위 수준에 implicits을 가져올 수 없습니다 왜 어떤 아이디어가?

답변

1

beforeAll은 테스트 전에 실행되지만 클래스의 생성자보다 먼저 실행되지 않습니다. 첫 조각에서 작업의 순서는 다음과 같습니다

  1. 생성자가 호출, val testSqlctx = sqlctx

  2. beforeAll

    를 호출 import sqlctx.implicits._을 실행
  3. 테스트가

그리고 작업의 순서를 실행 두 번째 스 니펫 :

  1. beforeAll 당신이 당신의 SparkContext 기본 (null) 값을 제공하고, beforeAll 그것을 작업의 첫 번째 순서는 것 초기화 가정 val testSqlctx = sqlctximport sqlctx.implicits._

을 실행

  • 테스트 실행 호출 여전히 null 인 경우 sqlctx을 사용해보십시오. 따라서 null 포인터 예외가 발생합니다.

  • +0

    감사합니다. 그래서 나는 beforeAll 메소드가 아니라 특성의 생성자에서 제대로 초기화해야한다고 생각합니다. – psarka