次のように、バッキング Bean メソッドを呼び出す junit テスト メソッドがあります。
myBackingBean.signup();
、バッキング Bean メソッドで への呼び出しがFaces.getLocale()
あり、その行で null ポインター例外が発生します
UIViewRoot viewRoot = context.getViewRoot();
テスト メソッドでロケールを設定し、このエラーを修正する方法を教えてください。
解決策は次のとおりでした。
1- 次のクラスをプロジェクトに追加します。
public abstract class FacesContextMocker extends FacesContext {
private FacesContextMocker() {
}
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;
}
}
2- テストの @Before で、次のコードを使用します。
FacesContext facesContext = FacesContextMocker.mockFacesContext();
UIViewRoot uiViewRoot = Mockito.mock(UIViewRoot.class);
Mockito.when(facesContext.getCurrentInstance().getViewRoot())
.thenReturn(uiViewRoot);
Mockito.when(
facesContext.getCurrentInstance().getViewRoot().getLocale())
.thenReturn(new Locale("en"));