How to specify context path for jersey test with external provider

做~自己de王妃 提交于 2019-12-20 06:00:41

问题


I want my jersey tests to run on one instance of tomcat which has the rest services running at

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

I have both in memory and external container dependencies

[ 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'],

Then in the test i over ride the below method to decide which container to choose

  @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();
  }    

The in memory test works because the services are deployed by the framework at path which it knows(it does not have a context path anyway) When i run on external container it tries to connect to http://myhost:port/service1/ instead of http://myhost:port/contexpath/service1/ thus getting 404 not found

To run on an external container how do i specify the context path ? The documentation specifies only host and port property.Is there any property for context path ?

I am using Jersey 2.17


回答1:


Finally I figured out a solution

 @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);
      }
      };
  }



回答2:


If you have your external servlet:

Import the jersey-test-framework-core apis to implement your own TestContainerFactory

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

.

Let JerseyTest know you will have your own provider through SystemProperties

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

.

Create your own provider (better and more custom configurable than their 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
            }
        };
    }
}


来源:https://stackoverflow.com/questions/31366692/how-to-specify-context-path-for-jersey-test-with-external-provider

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!