2016-08-29 10 views
0

暗黙的なインポートがスカラーテストで期待通りに機能しない理由を理解するのは難しいです。単純化失敗(火花を使用して、私はそれがまた私のカスタムクラスで失敗することができます)の例は次のとおりです。スカートでの暗黙のメソッドのインポート

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.toDFは、sqlctx.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 
    } 
} 

私はテストクラスのトップレベルで暗黙をインポートすることはできませんなぜ任意のアイデアは?

答えて

1

beforeAllすべてのテストの前に実行されますが、クラスのコンストラクタの前には実行されません。最初のスニペットの動作の順序は、

  1. コンストラクタval testSqlctx = sqlctximport sqlctx.implicits._

  2. beforeAll

  3. テストは

と操作の順序を実行して起動実行、起動しました2番目のスニペットの場合:

  1. beforeAllはあなたSparkContextデフォルト(null)値を与えると、beforeAllでそれを操作の最初の順序はなり初期化すると仮定val testSqlctx = sqlctximport sqlctx.implicits._

を実行し、

  • テストを実行呼び出さまだnullの場合はsqlctxを使用してください。これにより、NULLポインタ例外が発生します。

  • +0

    ありがとうございます。ですから、 'beforeAll'メソッドではなく、特性のコンストラクタで適切に初期化する必要があります。 – psarka

    関連する問題