GWT アプリに適切なモック フレームワークを使用することに関心があります。Mockito、EasyMock、および jMock が Java で最も人気のあるものの 1 つであることは理解しています。私のような GWT テスト初心者を助けるために、GWT に関連するので、誰かが最もよく知っているモッキング フレームワークの長所と短所を挙げてもらえますか?
前もって感謝します。
サーバー側のテスト (RPC サービス) では、任意のモック フレームワークを使用できます。spring-test ライブラリは、HttpRequest、HttpSession、およびその他のサーブレット API のクラスをモックするのに役立つ場合があります。それでも、適切にエンコードされたリクエストが必要なため、RemoteServiceServlet を拡張するクラスをテストする際に問題が発生する可能性があります。この問題を解決する興味深いプロジェクトは次のとおりです。
http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/
クライアント側の GWT コード (Java Script にコンパイルされる部分) のテストに関しては、GWTTestCase を拡張できます。ただし、JRE ライブラリのエミュレーションが制限されているため、特にリフレクション API が不足しているため、モック フレームワークを使用することは不可能です。さらに、GWTTestCase の実行時間は非常に遅いため、単体テストではなく統合テストのベースとして検討してください。
GWT アプリケーションが Model View Presenter パターンに従っている場合、GWT クライアント コードの単体テストを作成することができます。いわゆる「Presenter」(ロジック) をテストしていると仮定すると、任意のモック フレームワークでいわゆる「Display」をモックできます。Mockito を使用した単体テストの例を次に示します。
import static org.mockito.BDDMockito.*;
import org.junit.Test;
import com.google.gwt.user.client.ui.HasText;
public class ResultPresenterTest {
@Test
public void shouldSetItWorksResultText() {
// given
ResultPresenter.Display display = mock(ResultPresenter.Display.class);
MockButton button = new MockButton();
HasText label = mock(HasText.class);
given(display.getShowResultButton()).willReturn(button);
given(display.getResultLabel()).willReturn(label);
ResultPresenter presenter = new ResultPresenter();
presenter.bind(display);
// when
button.click();
// then
verify(label).setText("It works");
}
}
プレゼンターは次のとおりです。
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.ui.HasText;
public class ResultPresenter {
private Display display;
public interface Display {
HasClickHandlers getShowResultButton();
HasText getResultLabel();
}
public void bind(final Display display) {
this.display = display;
display.getShowResultButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
showResult();
}
});
}
public void showResult() {
display.getResultLabel().setText("It works");
}
}
そして、ここに小さなヘルパークラスがあります:
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
public class MockButton implements HasClickHandlers {
private HandlerManager handlerManager = new HandlerManager(this);
public void click() {
handlerManager.fireEvent(new ClickEvent() {
});
}
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
return handlerManager.addHandler(ClickEvent.getType(), handler);
}
@Override
public void fireEvent(GwtEvent<?> event) {
handlerManager.fireEvent(event);
}
}
button.click() の代わりに「when」セクションで presenter.showResult() を呼び出すことは理にかなっていますが、ご覧のとおり、イベント循環のモックも可能です。
Google GIN は、ランタイム/テスト コンテキストに応じて異なるインスタンスをバインドできるため、非常に便利です。GWTTestCase 以外のプレゼンター テストでは、GIN を Guice に置き換えることができます。
com.google.gwt.junit.GWTMockUtilities も非常に役立つ場合があります。
私たちはGWT プロジェクトにGwt-test-utilsを喜んで使用しています。
mockito を使用して RPC 呼び出しをモックするのは非常に簡単です。
最初に、テストでモックされたサービスを宣言します。
@Mock
private ServiceAsync service;
次に、成功したコールバックをモックする場合:
doSuccessCallback(result).when(service).myMethod(eq("argument"), any(AsyncCallback.class));
詳細: http://code.google.com/p/gwt-test-utils/wiki/MockingRpcServices