JSF バッキング Bean クラスに単体テストを実装しようとして苦労しています...たとえば、メソッドのいくつかは、この種のコードを使用して取得されたセッションまたは要求パラメーターを使用します。
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("paramKey");
.
私の質問は、セッションまたはリクエストから値を取得するメソッドをテストするにはどうすればよいですか?
JSF バッキング Bean クラスに単体テストを実装しようとして苦労しています...たとえば、メソッドのいくつかは、この種のコードを使用して取得されたセッションまたは要求パラメーターを使用します。
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("paramKey");
.
私の質問は、セッションまたはリクエストから値を取得するメソッドをテストするにはどうすればよいですか?
モックすることは可能FacesContext
ですが、これは理想的とは言えません。モッキートの例:
import javax.faces.context.FacesContext;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public abstract class ContextMocker extends FacesContext {
private ContextMocker() {}
private static final Release RELEASE = new Release();
private static class Release implements Answer<Void> {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
setCurrentInstance(null);
return null;
}
}
public static FacesContext mockFacesContext() {
FacesContext context = Mockito.mock(FacesContext.class);
setCurrentInstance(context);
Mockito.doAnswer(RELEASE)
.when(context)
.release();
return context;
}
}
プラットフォームがサポートしている場合は、JSF マネージド BeanよりもCDIを優先してください。CDI には静的な依存関係チェックがあり、スコープ リークを防ぐためにプロキシを挿入します。CDI は JSF のすべての機能をサポートしているわけではありませんが、必要に応じて JSF マネージド Bean を CDI に接続するのは比較的簡単です。
JSF マネージド Bean は型を注入するスコープを制限しますが、それでもスコープ リークにつながる可能性があります。たとえば#{sessionScope}
、オブジェクトがリクエスト スコープに属していても、変数をセッション スコープ Bean に注入できますExternalContext
。これは、独自の JSF Bean プロキシを作成することで解決できます。
注: この記事のほとんどは、Java EE 6 を念頭に置いて書かれています。Java EE 7 で改善された可能性があります。