如何使用外部提供程序指定球衣测试的上下文路径

How to specify context path for jersey test with external provider

我希望我的球衣测试在 tomcat 的一个实例上进行 运行,其余服务 运行ning 在

 http://myhost:port/contexpath/service1/ 
 http://myhost:port/contexpath/service2/ 
 ..so on

我有内存和外部容器依赖性

[ group: 'org.glassfish.jersey.test-framework.providers', name: 'jersey-test-framework-provider-inmemory', version: '2.17'],
[group: 'org.glassfish.jersey.test-framework.providers', name: 'jersey-test-framework-provider-external' , version: '2.17'],

然后在测试中我超越了下面的方法来决定选择哪个容器

  @Override
  public TestContainerFactory getTestContainerFactory() {
    System.setProperty("jersey.test.host", "localhost");
    System.setProperty("jersey.config.test.container.port", "8000");
    //how to set the context path ??
    return new ExternalTestContainerFactory();
  }    

内存测试有效,因为服务是由框架部署在它知道的路径上(无论如何它没有上下文路径) 当我 运行 在外部容器上时,它会尝试连接到 http://myhost:port/service1/ instead of http://myhost:port/contexpath/service1/ 从而得到 404 not found

到外部容器上的 运行 我如何指定上下文路径? 该文档仅指定主机和端口 property.Is 上下文路径有任何 属性 ?

我正在使用 Jersey 2.17

终于想到了解决办法

 @Override
  public TestContainerFactory getTestContainerFactory() {
    return new ExternalTestContainerFactory(){

      @Override
      public TestContainer create(URI baseUri, DeploymentContext context)
          throws IllegalArgumentException {
        try {
          baseUri = new URI("http://localhost:8000/contextpath");
        } catch (URISyntaxException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        return super.create(baseUri, context);
      }
      };
  }

如果您有外部 servlet:

导入 jersey-test-framework-core api 以实现您自己的 TestContainerFactory

testCompile 'org.glassfish.jersey.test-framework:jersey-test-framework-core:2.22.2'

.

让 JerseyTest 知道您将通过 SystemProperties 拥有自己的提供程序

systemProperty 'jersey.config.test.container.factory', 'my.package.MyTestContainerFactory'

.

创建您自己的提供商(比他们的 jersey-test-framework-provider-external 更好、更可自定义配置)

import org.glassfish.jersey.test.spi.TestContainer;
import org.glassfish.jersey.test.spi.TestContainerFactory;


public class MyTestContainerFactory implements TestContainerFactory {


    @Override
    public TestContainer create(URI baseUri, DeploymentContext deploymentContext) {
        return new TestContainer(){

            @Override
            public ClientConfig getClientConfig() {
                return null;
            }

            @Override
            public URI getBaseUri() {
                return URI.create("http://localhost:8080/myapp/api");
            }

            @Override
            public void start() {
                // Do nothing
            }

            @Override
            public void stop() {
                // Do nothing
            }
        };
    }
}