【问题标题】:Arquillian Graphene @Location placeholderArquillian Graphene @Location 占位符
【发布时间】:2016-09-18 19:34:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: jboss-arquillian arquillian-drone graphene2


    【解决方案1】:

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

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

    【讨论】:

    • 类似于pageInstance.open(parametersMap) 和地图例如id => 7。我正在寻找石墨烯的来源,也许我会发现一些有用的东西。感谢您的帮助!
    【解决方案2】:

    目前在石墨烯中这是不可能的。我创建了ARQGRA-500

    现在可以扩展 Graphene 以添加动态参数。就是这样。 (Arquillian 1.1.10.Final,石墨烯 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 之前,您必须通过这种迂回的 provideLocationParameters 方式提供参数。有点奇怪。您可以制作自己的替代 API、接受参数的 goTo,并修改您的 LocationDecider 以支持其他 ParameterProviders。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2013-09-13
      • 1970-01-01
      相关资源
      最近更新 更多