2016-09-18 13 views
1

지금 Arquillian을 배우고 있습니다. 경로 안에 자리 표시자가있는 페이지를 만드는 방법을 궁금해합니다. 예를 들어 :Arquillian Graphene @Location placeholder

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

또는

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

나는 성공없이 graphine 및 arquillian 참조 가이드에 대한 대답을 찾고있다. 페이지 객체를 지원하는 다른 언어의 라이브러리를 사용했지만 자리 표시 자에 대한 빌드 인 지원 기능을 제공합니다.

답변

0

AFAIK Graphene에서 구현 된 것과 같은 것은 없습니다. 솔직히 말하면, 이것이 어떻게 작동해야하는지 모르겠습니다 - 어떻게 값을 전달 하시겠습니까 ...?

그 외에도에서, 나는 그것이 또한이 그래 핀에서하실 수 없습니다 자바 주석 능력 https://stackoverflow.com/a/10636320/6835063

+0

'pageInstance.open (parametersMap)'과 같은 것이고 맵은'id => 7 '입니다. 나는 그라 핀의 근원을보고 있습니다. 아마 도움이 될만한 것을 찾을 수있을 것입니다. 도와 주셔서 감사합니다! – Yavin

0

에 의해 제한 될 수 있다고 생각합니다. 나는 ARQGRA-500을 만들었습니다.

Graphene를 확장하여 동적 매개 변수를 추가 할 수 있습니다. 방법은 다음과 같습니다. (Arquillian 1.1.10. 최종, Graphene 2.1.0. 최종)

인터페이스를 만듭니다.

import java.util.Map; 

public interface LocationParameterProvider { 

    Map<String, String> provideLocationParameters(); 

} 

해당 Graphene를 대체 할 사용자 지정 LocationDecider를 만듭니다. 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를 사용하기 전에이 roundabout의 provideLocationParameters 방식을 통해 매개 변수를 제공해야한다는 것을 의미합니다. 이상해. 자신 만의 대체 API, 매개 변수를 허용하는 goTo 및 다른 ParameterProvider를 지원하도록 LocationDecider를 수정할 수 있습니다.