我是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
。
答案 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()
。