2010-08-05 62 views
4

我有興趣爲我的GWT應用程序使用正確的嘲笑框架。我的理解是Mockito,EasyMock和jMock是Java中最受歡迎的程序。是否有人列出了他們最熟悉的模擬框架的優點/缺點,因爲它與GWT有關,可以幫助像我這樣的GWT測試noobs?GWT嘲笑框架的綜合優點/缺點

在此先感謝。

回答

7

對於服務器端測試(RPC服務),您可以使用任何您希望的模擬框架。 spring-test庫可能會用於模擬HttpRequest,HttpSession和其他類的servlet api。您仍然可能在擴展RemoteServiceServlet的測試類時遇到問題,因爲它們需要正確編碼的請求。這是有趣的項目,它解決了這個問題:

http://www.gdevelop.com/w/blog/2010/01/10/testing-gwt-rpc-services/

當涉及到的客戶端GWT代碼(編譯爲Java腳本的部分)的測試,你可以擴展GWTTestCase。然而,由於JRE庫的模擬有限,特別是缺乏反射API,所以不可能使用任何模擬框架。更重要的是,GWTTestCase運行時非常慢,因此考慮作爲集成測試的基礎而不是單元測試。

如果GWT應用程序遵循模型視圖展示器模式,則可以爲GWT客戶端代碼創建單元測試。假設我們正在測試所謂的「演示者」(邏輯),我們可以用任何模擬框架來嘲笑所謂的「顯示」。下面是使用例子的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); 
    } 

} 

這將是有意義的調用presenter.showResult ()在'when'部分而不是button.click()中,但是你可以看到事件循環的嘲弄也是可能的。

Google GIN可能非常有用,因爲它允許根據運行時/測試上下文綁定不同的實例。在非GWTTestCase演示者測試中,GIN可以替換爲Guice。

com.google.gwt.junit.GWTMockUtilities可能也非常有用。

2

我們很高興爲我們的GWT項目使用Gwt-test-utils

嘲諷的RPC的Mockito要求是很容易的:

首先你宣佈你嘲笑的服務在您的測試:

@Mock 
private ServiceAsync service; 

那麼當你需要模擬一個成功的回調:

doSuccessCallback(result).when(service).myMethod(eq("argument"), any(AsyncCallback.class)); 

更多關於:http://code.google.com/p/gwt-test-utils/wiki/MockingRpcServices