에 의해 제한 될 수 있다고 생각합니다. 나는 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를 수정할 수 있습니다.
'pageInstance.open (parametersMap)'과 같은 것이고 맵은'id => 7 '입니다. 나는 그라 핀의 근원을보고 있습니다. 아마 도움이 될만한 것을 찾을 수있을 것입니다. 도와 주셔서 감사합니다! – Yavin