使用 InMemoryTestContainerFactory 时为 JerseyTest 设置 baseUrl



我是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(例如,请参阅此内容)。然而,如果我将其设置为某个任意值http://localhost:xxx则连接被拒绝(显然?如果我仅将其设置为路径,则会出现错误base URL is not absolute.

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

但是你真的不需要使用它。 JerseyTest已经为您设置了ClientWebTarget(从getBaseUri构建)。您只需target打电话即可获得它,例如

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

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

最新更新