2016-09-18 13 views
1

Я изучаю Аркиллиан прямо сейчас. Интересно, как создать страницу, в которой есть местозаполнитель внутри пути. Например: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 ничего подобного не реализовано. Если честно, я не уверен, как это должно вести себя - как бы вы передали ценности ...?

Кроме того, я думаю, что это может быть также ограничено аннотаций возможностями 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 один. Этот ресивер добавит параметры местоположения в 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's.

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 { 

    } 

} 

Я специально сосредоточил внимание на параметрах, но, надеюсь, это проложит путь для других динамических манипуляций с путями.

Конечно, это не исправит API Graphene.goTo. Это означает, что перед использованием goTo вам необходимо предоставить параметры через этот кольцевой способ, обеспечивающий путьLocationParameters. Это странно. Вы можете создать свой собственный альтернативный API, goTo, который принимает параметры и модифицирует LocationDecider для поддержки других ParameterProviders.

 Смежные вопросы

  • Нет связанных вопросов^_^