首页 文章

Arquillian Graphene @Location占位符

提问于
浏览
1

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

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

要么

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

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

2 回答

  • 0

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

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

  • 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 .

相关问题