2017-06-19 61 views
0

私のチームと私はプロジェクトとしてSpringでWebappを作ったので、コードの大部分をテストしなければなりません。問題は、かなり多くのメソッドでFaceContextメッセージを使用していることです。これらのメソッドをテストしようとすると、常にFaceContext-MessagesでNullPointerExceptionが返されます。 どうすればそれらを避けることができますか?JunitテストでFaceContextからのNullPointerExceptionを回避する方法は?

私たちの現在の解決策は@Test(expect = NullPointerException.class)を使用することですが、それは実際に私たちが行きたい方法ではありません。これはJunitで可能ですか?これはSeleniumが必要ですか?

例は次のようになります。

public boolean validateInfo(){ 
    boolean correct = true; 
    if(startDate == null || endDate == null) { 
     if(startDate == null) 
    FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Gib ein Startdatum an!", "")); 
     if(endDate == null)    FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Gib ein Enddatum an!", "")); 

     return false; 
    } 
    if(startDate.after(endDate)) { 
     FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Startdatum muss vor dem Enddatum sein!", "")); 
     correct = false; 
    } 

    if(maxChildren < 1) { 
     FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Max. Kinderanzahl muss größer 0 sein!", "")); 
     correct = false; 
    } 

    if(bringTime.after(pickupTime)) { 
     FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Bringzeit muss vor dem Abholzeit sein!", "")); 
     correct = false; 
    } 
    return correct; 
} 

それは最初FaceContextメッセージに行くとNullPointerExceptionをスローします。助けてもらえますか? StackOverflow上の他の解決策は役に立たなかった。

+0

どのようにプログラムを起動しますか?いくつかのローカルサーバーにホスティングしていますか? –

答えて

1

シンプル:プロダクションコードがおそらくnullを返す静的メソッドを呼び出しています。

PowerMockやJMockitなどのフレームワークを使用して、モック静的呼び出しを使用できます。

もちろん、より良い方法は、静的呼び出しを避け、依存関係注入に頼ることです。静的なものを嘲笑することは悪い習慣とみなされます。だから、よりよいアプローチは、あなたの設計上の問題を「修正」するようなフレームワークを使うのではなく、テストするのが簡単になるように、プロダクションコードを変更することです。

1

facesContextはシングルトンではなく、実行時にリクエストを開始するという問題があります。 JUnitは文句を言わない。それ自体で、itllアップ嘲笑、またはでスタブする必要があり、その要求を処理することができ、ここでのFacesContext

http://illegalargumentexception.blogspot.com/2011/12/jsf-mocking-facescontext-for-unit-tests.html

の詳細を見ると、ここ http://docs.oracle.com/javaee/6/api/javax/faces/context/FacesContext.html

+0

あなたの答えは実際には見えませんでした。私はあまりにも好きです、あなたは親指をあげてください! –

+1

私と一緒に罰金、今日の一日の上限を私に蹴った! – GhostCat

0

を追加するにJavadocがあります@JasonDには、パフォーマンスと機能の関係があるので、それを呼び出すことに関してFacesContext#getCurrentInstance()を渡すように勧められています。

検証ロジックをコードに直接バンドルしないでください。エンティティとメソッドの検証にメタデータモデルとAPIを定義するため、JSR 349 - Bean Validationを使用してください。

Hibernate has an implementation and a good documentation on testing validation constraints

関連する問題