2

mockitoを使用してfacescontextをモックアウトするにはどうすればよいですか?

私はこのダミーメソッドを作成しました:

public String toPage2(){  
    if(isChecked()){  
        return NAV_STRING;  
    } else {  
        FacesContext context = FacesContext.getCurrentInstance();  
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sæt i kryds checkboxen", null));  
        return "";  
    }  
}  

JUnitテストを実行すると、getCurrentInstance()を呼び出すとnullpointer例外が発生します。

フェイスメッセージが追加されているかどうかを確認するために、facescontextをモックアウトしてテストを作成するにはどうすればよいですか?

4

6 に答える 6

2

(醜い)を導入するかFacesContext.setCurrentInstance()、静的メソッドを使用しないでください。

静的メソッドを変更できない場合は、FacesContextProviderそのメソッドを呼び出す のような別のものでラップします。プロバイダーに依存性を注入します。次に、代わりにそれをモックできます。

public MyClass(FacesContextProvider facesContextProvider) {
    this.facesContextProvider = facesContextProvider;
}

public String toPage2(){  
    if(isChecked()){  
        return NAV_STRING;  
    } else {  

        // Calls FacesContext.GetCurrentInstance() under the hood

        FacesContext context = facesContextProvider.getCurrentInstance();  
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sæt i kryds checkboxen", null));  
        return "";  
    }  
}  
于 2011-01-13T21:15:41.727 に答える
2

myfaces から MockFacesContext を使用してみることができます。とても便利な方法です。

于 2015-04-10T13:50:27.363 に答える
0

たとえば、Mockitoなどのモック ライブラリを追加機能で拡張できるフレームワークであるPowerMockを使用できます。この場合、 の静的メソッドをモックできます。FacesContext

Mockito メソッドを使用すると、メソッドが呼び出されverify()たことを確認できます。さらに、 のメソッド呼び出しに渡されたを取得するために をaddMessage()使用できます。ArgumentCaptorFacesMessageaddMessage()FacesContext

@Test
public void testToPage2NotChecked() {
    // mock all static methods of FacesContext
    PowerMockito.mockStatic(FacesContext.class);

    FacesContext facesContext = mock(FacesContext.class);
    when(FacesContext.getCurrentInstance()).thenReturn(facesContext);

    NavigationBean navigationBean = new NavigationBean();
    navigationBean.setCheck(false);

    // check the returned value of the toPage2() method
    assertEquals("", navigationBean.toPage2());

    // create an ArgumentCaptor for the FacesMessage that will be added to
    // the FacesContext
    ArgumentCaptor<FacesMessage> facesMessageCaptor = ArgumentCaptor
            .forClass(FacesMessage.class);
    // verify if the call to addMessage() was made and capture the
    // FacesMessage that was passed
    verify(facesContext).addMessage(Mockito.anyString(),
            facesMessageCaptor.capture());

    // get the captured FacesMessage and check the set values
    FacesMessage message = facesMessageCaptor.getValue();
    assertEquals(FacesMessage.SEVERITY_INFO, message.getSeverity());
    assertEquals("Sæt i kryds checkboxen", message.getSummary());
}

上記のコード サンプルをより詳細に説明するブログ投稿を作成しました。

于 2014-11-09T19:30:04.163 に答える
0

when()「モックのメソッド呼び出し」である必要がある引数が必要です。例えば:

when(mock.getArticles()).thenReturn(articles);

また、このエラーは次の理由で表示される場合があります。

  1. final/ private/ equals()/hashCode()メソッドのいずれかをスタブします。これらのメソッドはスタブ/検証できません。非公開の親クラスで宣言されたメソッドのモックはサポートされていません。
  2. 内部when()では、モックでメソッドを呼び出すのではなく、他のオブジェクトでメソッドを呼び出します。
于 2016-05-31T06:38:07.573 に答える
0

私はそれが古い質問であることを知っていますが、私の答えは役に立ちます..

私は常に、facesContext をモックするためにモックでオーバーライドする別のメソッドを使用します。

例えば:

バッキングビーン:

public void useFacesContext() {
   findCurrentFacesContext().addMessage("clientId", facesMessage);
}

FacesContext findCurrentFacesContext() {
   return FacesContext.getCurrentInstance();
}

テスト:

private BackingBean backingBean;

@Mock
private FacesContext facesContext;

@Before
public void init() {
  backingBean = new BackingBean() {
      @Override
      FacesContext findCurrentFacesContext() {
        return facescontext;
      }
  };
}
于 2015-05-26T09:57:34.870 に答える