2017-07-07 5 views
0

ScalaのPlay 2.6でコントローラをテストしようとすると、nullポインタ例外が発生します。 これはOK応答のためのテストです:Play 2.6のコントローラをユニットテストする

class ApplicationController @Inject() 
(orchestrator: ApplicationOrchestrator, cc: ControllerComponents) 
extends AbstractController(cc) with I18nSupport { 

    def home(): Action[AnyContent] = Action { 
     implicit request: RequestHeader => //line 29 
     Ok(views.html.home()) 
    } 
} 

それは暗黙の要求に関連付けられているようなエラーが見えますが、私は解決策を見つけることができません。

class ApplicationControllerSpec extends PlaySpec 
with MockitoSugar with ScalaFutures { 

    val mockOrchestrator = mock[ApplicationOrchestrator] 
    val mockCC = mock[ControllerComponents] 
    val controller = new ApplicationController(mockOrchestrator, mockCC) 
    val method = controller.home()(FakeRequest()) 

    assert(status(method) == 200) 
} 

これは、私がテストだコントローラであります。

ログ出力は次のようになります。

java.lang.NullPointerException was thrown. java.lang.NullPointerException at controllers.ApplicationController.home(ApplicationController.scala:29)

答えて

2

NPEはmock[ControllerComponents]を使用しているためです。ちょうどstubControllerComponents()とそれを置き換え、物事は期待どおりに動作します。

NPEは、メソッドを呼び出したり、正しく嘲笑されていないフィールドにアクセスしたときにテストで発生します。

私はこれを読んでいないと思います。 https://www.playframework.com/documentation/2.6.x/Highlights26#stubcontrollercomponents

0

方法は、それに供給するための要求を期待し、あなたがそれを有効な要求を与えていません。 FakeRequestにいくつかのパラメータを与える必要があるようです。

として有線、そのコントローラのメソッドあなたが持っているあなたのroutes.confファイル内の場合:

GET /home controllers.ApplicationController.home

は、その後、あなたのユニットテストでこの行:

val method = controller.home()(FakeRequest())

は本当にする必要があります:

val method = controller.home().apply(FakeRequest(GET, "/home"))

これで、期待どおりにテストを実行できるようになりました。

関連する問題