sve*_*iak 11 java cookies junit server-sent-events jersey-2.0
我正在尝试使用额外的cookie对Server Sent Event资源进行单元测试.我已经在为客户端使用Jersey作为EventSource和JavaX.以下代码工作正常:
WebTarget target = ClientBuilder.newBuilder()
.register(SseFeature.class)
.build()
.target("http://localhost:8080/sse");
EventSource eventSource = EventSource.target(target).build();
EventListener listener = new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
LOG.info(inboundEvent.readData(String.class));
}
};
eventSource.register(listener);
eventSource.open();
serverEventManager.send("/sse", "foo");
eventSource.close();
Run Code Online (Sandbox Code Playgroud)
Hoewever,对于额外的单元测试,我需要在请求中添加额外的cookie.我已经尝试了以下内容
target.(...).request.cookie("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
但是这会返回一个构建器,我无法从中为EventSource创建所需的WebTarget.
Jan*_*Jan 10
这是在EventSource中发生的事情,以建立给定WebTarget的连接:
private Invocation.Builder prepareHandshakeRequest() {
Invocation.Builder request = EventSource.this.target
.request(new MediaType[] { SseFeature.SERVER_SENT_EVENTS_TYPE });
if ((this.lastEventId != null) && (!(this.lastEventId.isEmpty()))) {
request.header("Last-Event-ID", this.lastEventId);
}
if (EventSource.this.disableKeepAlive) {
request.header("Connection", "close");
}
return request;
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到 - 没有机会在这里添加cookie.
因此WebTarget.request(new MediaType[] { SseFeature.SERVER_SENT_EVENTS_TYPE })
需要返回已添加所需cookie的Builder.
考虑这个委托类将所需的cookie添加到所有request*
类型方法:
public class CookieAddedWebTarget implements WebTarget {
private WebTarget base;
private Cookie cookie;
public CookieAddedWebTarget(WebTarget base, Cookie cookie) {
this.base = base;
this.cookie = cookie;
}
// Inject that cookie whenever someone requests a Builder (like EventSource does):
public Builder request() {
return base.request().cookie(cookie);
}
public Builder request(String... paramArrayOfString) {
return base.request(paramArrayOfString).cookie(cookie);
}
public Builder request(MediaType... paramArrayOfMediaType) {
return base.request(paramArrayOfMediaType).cookie(cookie);
}
public Configuration getConfiguration() {
return base.getConfiguration();
}
//All other methods from WebTarget are delegated as-is:
public URI getUri() {
return base.getUri();
}
public UriBuilder getUriBuilder() {
return base.getUriBuilder();
}
public WebTarget path(String paramString) {
return base.path(paramString);
}
public WebTarget matrixParam(String paramString, Object... paramArrayOfObject) {
return base.matrixParam(paramString, paramArrayOfObject);
}
public WebTarget property(String paramString, Object paramObject) {
return base.property(paramString, paramObject);
}
public WebTarget queryParam(String paramString, Object... paramArrayOfObject) {
return base.queryParam(paramString, paramArrayOfObject);
}
public WebTarget register(Class<?> paramClass, Class<?>... paramArrayOfClass) {
return base.register(paramClass, paramArrayOfClass);
}
public WebTarget register(Class<?> paramClass, int paramInt) {
return base.register(paramClass, paramInt);
}
public WebTarget register(Class<?> paramClass, Map<Class<?>, Integer> paramMap) {
return base.register(paramClass, paramMap);
}
public WebTarget register(Class<?> paramClass) {
return base.register(paramClass);
}
public WebTarget register(Object paramObject, Class<?>... paramArrayOfClass) {
return base.register(paramObject, paramArrayOfClass);
}
public WebTarget register(Object paramObject, int paramInt) {
return base.register(paramObject, paramInt);
}
public WebTarget register(Object paramObject, Map<Class<?>, Integer> paramMap) {
return base.register(paramObject, paramMap);
}
public WebTarget register(Object paramObject) {
return base.register(paramObject);
}
public WebTarget resolveTemplate(String paramString, Object paramObject) {
return base.resolveTemplate(paramString, paramObject);
}
public WebTarget resolveTemplate(String paramString, Object paramObject, boolean paramBoolean) {
return base.resolveTemplate(paramString, paramObject, paramBoolean);
}
public WebTarget resolveTemplateFromEncoded(String paramString, Object paramObject) {
return base.resolveTemplateFromEncoded(paramString, paramObject);
}
public WebTarget resolveTemplates(Map<String, Object> paramMap) {
return base.resolveTemplates(paramMap);
}
public WebTarget resolveTemplates(Map<String, Object> paramMap, boolean paramBoolean) {
return base.resolveTemplates(paramMap, paramBoolean);
}
public WebTarget resolveTemplatesFromEncoded(Map<String, Object> paramMap) {
return base.resolveTemplatesFromEncoded(paramMap);
}
}
Run Code Online (Sandbox Code Playgroud)
现在您应该能够将您的测试重新考虑到:
EventSource eventSource = EventSource.target(new CookieAddedWebTarget(target,
new Cookie("name", "value"))).build();
Run Code Online (Sandbox Code Playgroud)
并且应该插入cookie.
警告:我无法测试这个.解决方案仅基于阅读jersey-media-sse-2.22.1的源代码.
祝好运.