Arquillian Graphene @Location占位符

时间:2016-09-18 19:34:42

标签: jboss-arquillian arquillian-drone graphene2

我现在正在学习Arquillian我想知道如何创建在路径中有占位符的页面。例如:

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

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

我在寻找graphine和arquillian参考指南的答案但没有成功。我使用了其他语言中支持页面对象的库,但它内置了对占位符的支持。

2 个答案:

答案 0 :(得分:0)

AFAIK在石墨烯中没有这样的实现。 说实话,我不确定这应该如何表现 - 你会如何传递价值......?

除此之外,我认为它也可能受到Java注释能力的限制https://stackoverflow.com/a/10636320/6835063

答案 1 :(得分: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来替换相应的Graphene的一个。我替换了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必须注册才能覆盖Graphene的。

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之前,您必须通过此环形交叉路径提供参数提供参数。这很奇怪。您可以创建自己的替代API,goTo接受参数,并修改LocationDecider以支持其他ParameterProviders。