トップ 一覧 ヘルプ RSS ログイン

ClickMockApiの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!![Click Mock API|http://click.sourceforge.net/docs/mock-api/overview-summary.html]

Click Mock は、Tomcat や Jetty のようなサーブレットコンテナを必要とせずにControl や Page をテストすることが可能となるフルスタックの[モック|http://click.sourceforge.net/docs/mock-api/net/sf/click/package-summary.html]です。

モックのパッケージは、個別のjarで提供されていて、ダウンロードしたClickの配布パッケージで利用可能です。distフォルダの click-mock-<version>.jar がそれになります。

テストのために用いられる、2つの関係するクラス - [MocContainer|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html] と [MockContext|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContext.html] - が含まれます。

!!MockContainer
あなたが作成した Page をテスト(機能テスト)するには、
Tomcat や Jetty のようなサーブレットコンテナを模した [MockContainer|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html] を利用することになります。
このコンテナを利用することで、テスト用のページリクエストやフォームサブミット、
ファイルのアップロードやナビゲーション等を実行できます。

MockContainer を使用するためには、
 javascriptやスタイルシート、画像などのリソースがあるwebディレクトリを指定する必要があります。
一番簡単な方法は、プロジェクトのwebディレクトリを指定することでしょう。

例えばプロジェクトが c:\dev\myproject にあるとして、webリソースは c:\dev\myproject\web 以下に
あるとします。この場合、単に c:\dev\myproject\web を指定するだけです。

例(ここでは JUnitを使っています):

{{code java
public class IntegrationTest extends TestCase {   
    public void testFirstPage() {   
        // Specify the project web directory for example: 'c:/dev/myproject/web' 
        MockContainer container = new MockContainer("c:/dev/myproject/web"); 
        ... 
    } 
} 
}}

内部的には、MockContainer は一つの [MockContext|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContext.html] インスタンスを生成し、
 いくつかのサーブレットスタブを作成します。以下そのスタブのリストです。

* [MockRequest|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockRequest.html]
* [MockResponse|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockResponse.html]
* [MockServletContext|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockServletContext.html]
* [MockServletConfig|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockServletConfig.html]
* [MockSession|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockSession.html]

MockContainer はサーブレットスタブへのアクセスのためのgetterを提供しています。
setterメソッドで独自のスタブインスタンスをMockContainer にセットすることも可能です。

独自のスタブをセットした場合には、MockContainerは自分で生成したものではなく、
登録されたものを利用します。

生成されたMockContainer は、[start|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html#start()] と [stop|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html#stop()] メソッドでライフサイクルを管理する必要があります。

{{code java
public class IntegrationTest extends TestCase { 
    public void testFirstPage() { 
        // Specify the project web directory for example: 'c:/dev/myproject/web' 
        MockContainer container = new MockContainer("c:/dev/myproject/web"); 
 
        // Bootstrap the container   
        container.start();   
 
        ... 
 
        container.stop(); 
    } 
} 
}}

HTTP のリクエストパラメータは、[MockRequest|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockRequest.html] 経由でセットされます。

MockContainer は、このための便利なメソッドを用意しています。
すなわち、[MockContainer.setParameter|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html#setParameter(java.lang.String,%20java.lang.String)] と [MockContainer.setParameter|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html#setParameter(java.lang.String,%20java.io.File,%20java.lang.String)] です。

リクエストアトリビュートをセットするために、[MockContainer.setAttribute|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html#setAttribute(java.lang.String,%20java.lang.Object)] を使います。

以下の例は、一連のテストになります。

{{code java
public class IntegrationTest extends TestCase { 
    public void testFirstPage() { 
        // Specify the project web directory for example: 'c:/dev/myproject/web' 
        MockContainer container = new MockContainer("c:/dev/myproject/web"); 
 
        // Bootstrap the container   
        container.start();   
 
        // Set the form name to ensure a Form submission occurs 
        container.setParameter(Form.FORM_NAME, "form"); 
 
        // Set the field value as a request parameter   
        container.setParameter("myfield", "one"); 
 
        // Simulate a user requesting the page, FirstPage. FirstPage will forward to SecondPage.   
        FirstPage page = (FirstPage) container.testPage(FirstPage.class);   
 
        // Assert that FirstPage does indeed forward to SecondPage 
        Assert.assertTrue(SecondPage.class, container.getForwardPageClass()); 
 
        // Assert that the Field named "myfield", was bound to request parameter "myfield" 
        Assert.assertTrue("one", page.getForm().getFieldValue("myfield")); 
 
        container.stop(); 
    } 
} 
}}

この例では、値をmyfieldフィールドにセットしています。
また、Click が form を処理しないので、Form.FORM_NAMEパラメータをセットしています。
Form.FORM_NAME にはフォームの名前、この例では"form"をセットしなければいけません。

Page の出力は、[MockContainer.getHtml()|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContainer.html#getHtml()] で利用可能です。

!!MockContext

MockContext は、カスタムコントロール(コンポーネント)をテストするときに有用です。

MockContext を使用するときに、webディレクトリを指定することは必須ではありません。

例:

{{code java
public class ValidationFieldTest extends TestCase { 
      
    public void testValidationField() { 
       
        // Initialize the context. 
        MockContext context = MockContext.initContext(); 
         
        ... 
} 
}}

MockContext は、コンテキストを初期化するいくつかのinitContextメソッドを提供します。

* [initContext()|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContext.html#initContext()]
* [initContext(String servletPath)|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContext.html#initContext(java.lang.String)]
* [initContext(Locale locale)|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContext.html#initContext(java.util.Locale)]
* [initContext(Locale locale, String servletPath)|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContext.html#initContext(java.util.Locale,%20java.lang.String)]
* [initContext(MockServletConfig servletConfig, MockRequest request, MockResponse response, ClickServlet clickServlet)|http://click.sourceforge.net/docs/mock-api/net/sf/click/MockContext.html#initContext(net.sf.click.servlet.MockServletConfig,%20net.sf.click.servlet.MockRequest,%20net.sf.click.servlet.MockResponse,%20net.sf.click.ClickServlet)]

MonckContext.initContext メソッドは、いくつかのサーブレッドスタブを生成します。
以下がそのスタブのリストです。

* [MockRequest|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockRequest.html]
* [MockResponse|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockResponse.html]
* [MockServletContext|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockServletContext.html]
* [MockServletConfig|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockServletConfig.html]
* [MockSession|http://click.sourceforge.net/docs/mock-api/net/sf/click/servlet/MockSession.html]

以下のサンプルコードでは、MockContext が ValidationFieldというカスタムコントロールをテストするのに使用されています。

{{code java
public class ValidationFieldTest extends TestCase { 
      
    public void testValidationField() { 
       
        // Initialize the context. 
        MockContext context = MockContext.initContext();   
          
        int maxLength = 10;   
        String fieldName = "name";   
        ValidationField field = new ValidationField(fieldName, maxLength);   
    
        // Retrieve the request and set field request parameter.   
        MockRequest request = context.getMockRequest();   
        request.setParameter(fieldName, "value");   
    
        // onProcess binds the request attribute and field value   
        assertTrue(textField.onProcess());   
          
        // Assert that the field is still valid.   
        assertTrue(textField.isValid());   
    } 
} 
}}