有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用InMemoryTestContainerFactory时为JerseyTest设置baseUrl

我是新来的。我已经为我的控制器创建了一些单元测试,方法是跟随大量关于这个主题的帖子以及这个站点上的各种问题。我使用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


共 (2) 个答案

  1. # 1 楼答案

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

    但你真的不需要用这个JerseyTest已经为您设置了一个ClientWebTarget(由getBaseUri构建)。您只需调用target即可获得它,例如

    Response response = target().request().get();
    // or
    Response response = target("path").request().get();
    
  2. # 2 楼答案

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