使用InMemoryTestContainerFactory时为JerseyTest设置baseUrl

时间:2016-03-20 18:55:16

标签: java junit jersey jersey-test-framework

我是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

2 个答案:

答案 0 :(得分:1)

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

但你真的不需要使用它。 JerseyTest已经为您设置了Client WebTarget(由getBaseUri构建)。您只需要target来获取它,例如

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

答案 1 :(得分:0)

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