1

私は現在 Arquillian を学んでいます。パス内にプレースホルダーを持つページを作成する方法を知りたいです。例えば:

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

また

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

グラフィンとアルキリアンのリファレンスガイドに関する回答を探していますが、成功していません。ページオブジェクトをサポートする他の言語のライブラリを使用しましたが、プレースホルダーのサポートが組み込まれています。

4

2 に答える 2

0

私の知る限り、グラフェンに実装されているようなものはありません。正直なところ、これがどのように動作するべきかわかりません-どのように値を渡しますか...?

それとは別に、Javaアノテーション機能によっても制限される可能性があると思います https://stackoverflow.com/a/10636320/6835063

于 2016-09-20T08:47:50.220 に答える
0

これは現在グラフェンでは不可能です。ARQGRA-500を作成しました。

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

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

import java.util.Map;

public interface LocationParameterProvider {

    Map<String, String> provideLocationParameters();

}

カスタム LocationDecider を作成して、対応するグラフェンのものを置き換えます。HTTPのものを置き換えます。このディサイダーは、テスト オブジェクトがインターフェイスを実装していることを確認すると、場所パラメーターを 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 をオーバーライドするには、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.goToAPI を修正しません。これは、goTo を使用する前に、このラウンドアバウトの provideLocationParameters 方法でパラメーターを提供する必要があることを意味します。それは奇妙だ。パラメータを受け入れる独自の代替 API である goTo を作成し、LocationDecider を変更して他の ParameterProviders をサポートすることができます。

于 2017-03-30T10:57:30.930 に答える