【问题标题】:Set baseUrl for JerseyTest when using InMemoryTestContainerFactory使用 InMemoryTestContainerFactory 时为 JerseyTest 设置 baseUrl
【发布时间】:2016-07-07 04:43:41
【问题描述】:

我是JerseyTest 的新手。通过关注有关该主题的大量帖子以及该站点上的各种问题,我为我的控制器创建了一些单元测试。我正在使用InMemoryTestContainerFactory,因为我的测试非常简单。但是,似乎没有办法在设置过程中设置baseUri。我的目标是什么?我的测试类扩展了以下类:

public abstract class ApiTest extends JerseyTest {

    @Override
    protected TestContainerFactory getTestContainerFactory() {
        return new InMemoryTestContainerFactory();
    }

    @Override
    protected ResourceConfig configure() {
        ResourceConfig rc = new ResourceConfig()
                .register(SpringLifecycleListener.class)
                .register(RequestContextFilter.class)
                .register(this)
                .property("contextConfig", new AnnotationConfigApplicationContext(ApplicationConfiguration.class));

        enable(TestProperties.LOG_TRAFFIC);
        enable(TestProperties.DUMP_ENTITY);
        forceSet(TestProperties.CONTAINER_PORT, "0");

        return configure(rc);
    }

    protected abstract ResourceConfig configure(ResourceConfig rc);
}

示例测试类:

public class ResourceTest extends ApiTest {

    private final Client webClient = ClientBuilder.newClient();

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Mock
    private ResourceService service;

    @Before
    public void setUp() throws Exception {
        initMocks(this);
    }

    @Override
    protected ResourceConfig configure(ResourceConfig rc) {
        rc.register(Resource.class);
        return rc;
    }

    @Test
    public void testGetResource() {

        Response response = webClient
                .target("http://localhost:8080")
                .path("/resource")
                .queryParam("id", "some_id_json")
                .request(MediaType.APPLICATION_JSON_TYPE)
                .get();

        assertThat(response.getStatus(), is(Response.Status.BAD_REQUEST));
        assertThat(response.readEntity(Errors.class).getMessages().get(0), isA(String.class));
    }
}

此站点上可用的示例代码似乎都没有配置baseUri(例如,请参阅this)。然而,如果我将它设置为任意值http://localhost:xxx 我会被拒绝连接(显然?)。如果我将其设置为仅路径,则会收到错误 base URL is not absolute

【问题讨论】:

    标签: java junit jersey jersey-test-framework


    【解决方案1】:

    您可以覆盖JerseyTest 中的URI getBaseUri()。默认为localhost:9998

    但您实际上并不需要使用它。 JerseyTest 已经为您设置了Client WebTarget(由getBaseUri 构建)。您只需拨打target 即可获得它,例如

    Response response = target().request().get();
    // or
    Response response = target("path").request().get();
    

    【讨论】:

    • 第一个给了我NullPointerException。第二个抱怨 URL 不是绝对的。我可以看到基本 URI 设置为http://localhost:0。我猜问题出在设置容器上。
    • 我找了一个小时才找到这个问题的答案;端口 9998 的秘密被很好地隐藏,并且似乎从 JerseyTest 官方文档页面中丢失。 localhost:9998 是问题的答案,应该被接受。
    【解决方案2】:

    发现问题。我在没有调用 super.setUp() 的情况下覆盖了 setUp(),因此没有调用 TestContainer.start()

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多