2016-09-18 124 views
1

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

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

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

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

回答

0

AFAIK在Graphene中没有这样的实现。 说实话,我不确定这应该如何表现 - 你将如何通过价值观......?

除此之外,我认为它可以通过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以替换相应的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。