2011-01-07 36 views
1

mockitoを使用してfacescontextをモックアウトするにはどうすればよいですか?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(呼び出すときに、私は)nullポインタ例外を取得します。

facesmessageが追加されている場合はどうすればfacescontextを模擬してテストを書くことができますか?

ありがとうございました。

答えて

2

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

静的メソッドを変更できない場合は、そのメソッドを呼び出すFacesContextProviderのようなものにラップします。依存関係 - プロバイダを挿入します。その後、代わりにそれを嘲笑することができます。あなたは、たとえば、あなたが余分な機能を備えたMockitoのようなモックライブラリを拡張することを可能にするフレームワークですPowerMockを使用することができます

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 ""; 
    } 
} 
+0

クラスはバッキングBeanなので、コンストラクタはパラメータを取ることができません。または...? facescontextのインスタンスをセットアップするために、私のテストクラスのsetupメソッドに何かを追加することはできませんか? – Chris

+0

文脈を提供するものについては、私はそれをラップします。あなたが強制するクラスの上で必要な種類のコントロールを持っていない場合は、それをラップしてください。あるラッパーと別のラッパーの相互作用をユニットテストすることになります。それで大丈夫です;あなたのクラスは正しい方法で自分のクラス(あなたのコントロールの外)を使用し、それに応答することをテストします。あなたのコントロールの外のクラスはあまり頻繁に変更されていないので、残りは検査と手動テストによって発生することができます(もしそうであれば、何かがうまくいかなかった場合にdevsを助けることができるように!) – Lunivore

0

。この場合は、FacesContextという静的メソッドをモックすることができます。

Mockitoverify()メソッドを使用すると、addMessage()メソッドが呼び出されたことを確認できます。さらに、FacesContextaddMessage()メソッド呼び出しに渡されたFacesMessageを取得するためにArgumentCaptorを使用することもできます。

私は、より詳細に上記のコードサンプルを説明 blog postを作成しました
@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()); 
} 

2

myfaceからMockFacesContextを使用できます。それは非常に便利な方法です。

0

私はいつも、私はのFacesContextを模擬する模擬で上書き別々のメソッドを使用

..私はそれが古い質問ですけど、私は私の答えは便利。例えば

BackingBean:

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; 
     } 
    }; 
} 
0

when() 'モック上のメソッド呼び出し' でなければならない引数を必要とします。たとえば :final/private/equals()/hashCode()方法:あなたがいずれかのスタブ

  1. :アップするので
    when(mock.getArticles()).thenReturn(articles); 
    

    はまた、このエラーが表示される場合があります。 これらのメソッドにはをスタブして検証することはできません。 非公開の親クラスで宣言されたモーキングメソッドはサポートされていません。
  2. when()あなたはモックでメソッドを呼び出すのではなく、他のオブジェクトでメソッドを呼び出します。
関連する問題