这是不可能的目前石墨烯也有限。我创建了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。
类似于'pageInstance.open(parametersMap)'而映射是例如'id => 7'。我在寻找石墨烯的来源,也许我会找到一些有用的东西。谢谢您的帮助! – Yavin