2016-09-18 14 views
1

私は今Arquillianを学んでいますが、パス内にプレースホルダを持つページを作成する方法を知りました。たとえば:Arquillian Graphene @Locationプレースホルダ

@Location("/posts/{id}") 
public class BlogPostPage { 
    public String getContent() { 
      // ... 
    } 
} 

または

@Location("/posts/{name}") 
@Location("/specific-page?requiredParam={value}") 

私は成功せずgraphineとarquillianリファレンスガイドの答えを探しています。私はページオブジェクトをサポートする他の言語のライブラリを使用しましたが、プレースホルダのためのビルドインサポートがあります。

答えて

0

AFAIKグラフェンに実装されているこのようなものはありません。 正直言って、これがどのように振る舞うべきかわかりません - どのように値を渡すのですか...?

とは別に、私はまた、これは、グラフェンには現在のところ不可能であるJavaアノテーション能力https://stackoverflow.com/a/10636320/6835063

+0

'pageInstance.open(parametersMap)'のようなもので、マップは例えば 'id => 7'です。私はグラフェンのソースを見ています。多分役立つものを見つけるでしょう。助けてくれてありがとう! – Yavin

0

によって制限される可能性があると思います。私はARQGRA-500を作成しました。

グラフェンを拡張して動的パラメータを追加できるようになりました。方法は次のとおりです。 (Arquillian 1.1.10.Final、Graphene 2.1.0.Final)

インターフェイスを作成します。

import java.util.Map; 

public interface LocationParameterProvider { 

    Map<String, String> provideLocationParameters(); 

} 

対応するグラフェンのものを置き換えるカスタムLocationDeciderを作成します。私はHTTPを置き換えます。このDeciderは、テストオブジェクトがインタフェースを実装していることがわかると、URIにロケーションパラメータを追加します。

import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 
import java.util.Map; 
import java.util.Map.Entry; 

import org.jboss.arquillian.core.api.Instance; 
import org.jboss.arquillian.core.api.annotation.Inject; 
import org.jboss.arquillian.graphene.location.decider.HTTPLocationDecider; 
import org.jboss.arquillian.graphene.spi.location.Scheme; 
import org.jboss.arquillian.test.spi.context.TestContext; 

public class HTTPParameterizedLocationDecider extends HTTPLocationDecider { 

    @Inject 
    private Instance<TestContext> testContext; 

    @Override 
    public Scheme canDecide() { 
     return new Scheme.HTTP(); 
    } 

    @Override 
    public String decide(String location) { 
     String uri = super.decide(location); 

     // not sure, how reliable this method of getting the current test object is 
     // if it breaks, there is always a possibility of observing 
     // org.jboss.arquillian.test.spi.event.suite.TestLifecycleEvent's (or rather its 
     // descendants) and storing the test object in a ThreadLocal 
     Object testObject = testContext.get().getActiveId(); 
     if (testObject instanceof LocationParameterProvider) { 
      Map<String, String> locationParameters = 
        ((LocationParameterProvider) testObject).provideLocationParameters(); 

      StringBuilder uriParams = new StringBuilder(64); 
      boolean first = true; 
      for (Entry<String, String> param : locationParameters.entrySet()) { 
       uriParams.append(first ? '?' : '&'); 
       first = false; 
       try { 
        uriParams.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
        uriParams.append('='); 
        uriParams.append(URLEncoder.encode(param.getValue(), "UTF-8")); 
       } catch (UnsupportedEncodingException e) { 
        throw new RuntimeException(e); 
       } 
      } 
      uri += uriParams.toString(); 
     } 

     return uri; 
    } 

} 

グラフェンのものを無効にするには、LocationDeciderを登録する必要があります。

import org.jboss.arquillian.core.spi.LoadableExtension; 
import org.jboss.arquillian.graphene.location.decider.HTTPLocationDecider; 
import org.jboss.arquillian.graphene.spi.location.LocationDecider; 

public class MyArquillianExtension implements LoadableExtension { 

    @Override 
    public void register(ExtensionBuilder builder) { 
     builder.override(LocationDecider.class, HTTPLocationDecider.class, 
      HTTPParameterizedLocationDecider.class); 
    } 

} 

MyArquillianExtensionはSPIを介して登録する必要がありますので、テストリソースに必要なファイルを作成してください。私の場合、ファイルパスはsrc/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtensionです。このファイルには、MyArquillianExtensionの完全修飾クラス名が含まれている必要があります。

それだけです。これで、テストでロケーションパラメータを提供できるようになりました。

import java.util.HashMap; 
import java.util.Map; 

import org.jboss.arquillian.graphene.page.InitialPage; 
import org.jboss.arquillian.graphene.page.Location; 
import org.junit.Test; 

public class TestyTest implements LocationParameterProvider { 

    @Override 
    public Map<String, String> provideLocationParameters() { 
     Map<String, String> params = new HashMap<>(); 
     params.put("mykey", "myvalue"); 
     return params; 
    } 

    @Test 
    public void test(@InitialPage TestPage page) { 
    } 

    @Location("MyTestView.xhtml") 
    public static class TestPage { 

    } 

} 

私は特にパラメータに焦点を当てましたが、うまくいけば、これは他の動的なパス操作のための道を開くでしょう。

もちろん、これはGraphene.goTo APIを修正しません。これは、goToを使用する前に、このroundaboutのprovideLocationParametersの方法でパラメータを指定する必要があることを意味します。それは奇妙だ。独自の代替APIを作成し、パラメータを受け入れるgoToを作成し、LocationDeciderを変更して他のParameterProviderをサポートすることができます。

関連する問題