- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在寻找有关如何最好地测试返回 SseEmitters 的 Spring MVC Controller 方法的提示。我的想法很短,但有一个反复试验的解决方案,可以测试异步、线程化的行为。下面是示例代码,只是为了演示概念,可能有一两个错字:
Controller 类:
@Autowired
Publisher<MyResponse> responsePublisher;
@RequestMapping("/mypath")
public SseEmitter index() throws IOException {
SseEmitter emitter = new SseEmitter();
Observable<MyResponse> responseObservable = RxReactiveStreams.toObservable(responsePublisher);
responseObservable.subscribe(
response -> {
try {
emitter.send(response);
} catch (IOException ex) {
emitter.completeWithError(ex);
}
},
error -> {
emitter.completeWithError(error);
},
emitter::complete
);
return emitter;
}
//A threaded dummy publisher to demonstrate async properties.
//Sends 2 responses with a 250ms pause in between.
protected static class MockPublisher implements Publisher<MyResponse> {
@Override
public void subscribe(Subscriber<? super MyResponse> subscriber) {
new Thread() {
@Override
public void run() {
try {
subscriber.onNext(response1);
Thread.sleep(250);
subscriber.onNext(response2);
} catch (InterruptedException ex) {
}
subscriber.onComplete();
}
}.start();
}
}
//Assume @Configuration that autowires the above mock publisher in the controller.
//Tests the output of the controller method.
@Test
public void testSseEmitter() throws Exception {
String path = "http://localhost/mypath/";
String expectedContent = "data:" + response1.toString() + "\n\n" +
"data:" + response2.toString() + "\n\n");
//Trial-and-Error attempts at testing this SseEmitter mechanism have yielded the following:
//- Returning an SseEmitter triggers 'asyncStarted'
//- Calling 'asyncResult' forces the test to wait for the process to complete
//- However, there is no actual 'asyncResult' to test. Instead, the content is checked for the published data.
mockMvc.perform(get(path).contentType(MediaType.ALL))
.andExpect(status().isOk())
.andExpect(request().asyncStarted())
.andExpect(request().asyncResult(nullValue()))
.andExpect(header().string("Content-Type", "text/event-stream"))
.andExpect(content().string(expectedContent))
}
最佳答案
这是一个更通用的答案,因为它旨在测试将永远运行但在给定超时后将与 SSE 流断开连接的 SseEmitter。
至于与 MVC 不同的方法,正如@ErinDrummond 对 OP 所评论的那样,您可能想要调查 WebFlux。
这是一个最小的例子。人们可能想要扩展请求的 header 、不同的匹配器或单独处理流输出。
它正在设置一个延迟线程以断开与 SSE Stream 的连接,这将允许执行断言。
@Autowired
MockMvc mockMvc;
@Test
public void testSseEmitter(){
ScheduledExecutorService execService = Executors.newScheduledThreadPool(1);
String streamUri = "/your-get-uri");
long timeout = 500L;
TimeUnit timeUnit = TimeUnit.MILLISECONDS;
MvcResult result = mockMvc.perform(get(streamURI)
.andExpect(request().asyncStarted()).andReturn();
MockAsyncContext asyncContext = (MockAsyncContext) result.getRequest().getAsyncContext();
execService.schedule(() -> {
for (AsyncListener listener : asyncContext.getListeners())
try {
listener.onTimeout(null);
} catch (IOException e) {
e.printStackTrace();
}
}, timeout, timeUnit);
result.getAsyncResult();
// assertions, e.g. response body as string contains "xyz"
mvc.perform(asyncDispatch(result)).andExpect(content().string(containsString("xyz")));
}
关于java - 集成测试 Spring SseEmitters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37140775/
我的 Spring 应用程序中存在 SSE 问题。 当我在本地环境中运行代码时,它运行良好。 但是当我在服务器上部署应用程序时,我无法从 SseController 获得响应 这是我的代码 @Ge
语言:Spring Boot,JS 概述 :我正在我的应用程序中实现服务器发送事件功能,该功能将部署在云代工厂中, 其中基于队列中的新消息(我已在我的微服务中订阅),我将向我的客户端/浏览器(使用 E
我一直在寻找有关如何最好地测试返回 SseEmitters 的 Spring MVC Controller 方法的提示。我的想法很短,但有一个反复试验的解决方案,可以测试异步、线程化的行为。下面是示例
我正在尝试使用 Spring 4(tomcat 7、servlet-api 3.0.1)制作服务器发送的事件。 问题是我的 Events 没有在方法 send 被调用后立即发送。它们仅在 SseEmi
我是服务器发送事件的新手,但不是 Spring 的新手。制作了一个 Controller ,该 Controller 从 UI 上的按钮触发,该按钮启动 SSEEmitter 并将其传递给另一个线程,
我正在使用 Java 开发一个 Spring 项目。我们在那里需要 ServerSentEvents,使用 SseEmitter 看起来是一种向客户端发送事件的简单方法。 我们还需要用Java实现客户
给定一个带有如下方法的简单 Controller : @RequestMapping(method = RequestMethod.GET, value = "{id}/update") public
我正在尝试像这篇文章中那样使用 Springs SseEmitter: Angular 2 spring boot server side events .推送事件有效,但每次我关闭或刷新选项卡时,我
我的目标是从前端向后端发送一个请求并接收多个响应。我正在使用 WebSocket,因为响应非常频繁,而且 WebSocket 似乎是最好的协议(protocol),而且 SseEmitter 从后端发
我有一个 SpringMVC 项目,其中我在其中一个 REST Controller 中使用 SseEmitter。下面是代码: @RequestMapping(path = "/finite/{co
我在 Java Spring 中使用服务器端事件 (SSE)。每当新客户端订阅事件服务时,我都会在 REST Controller 上执行以下代码: SseEmitter emitter = new
我有一个服务于 SSE 的 Spring Boot (v2.0.3) Web 应用程序,遇到了一个问题,有时 SseEmitter 实例卡在“初始化”状态,并且永远不会得到通过 配置的 Respons
当我调用服务器上的 Controller 时,我试图通知一个简单的 html 页面。我有一个调用我的 Controller 的 android 应用程序,完成后我想通知我的网页调用了 Controll
我在 Spring Boot 中的 SSEemitter 和 Flux 之间存在混淆,用于向客户端发送一种异步消息。 想知道与 Spring boot 相关的这两个术语的用例 最佳答案 一个是使用re
我正在尝试设置 Spring SseEmitter 来发送正在运行的作业状态的一系列更新。它似乎有效,但是: 每当我在 Java 服务器代码中调用 emitter.complete() 时,javas
我正在 Javascript 中使用 EventSource 连接到 Java Spring Boot 端点。 当我将应用程序连接到本地主机 java 服务器时,效果很好,但在连接到我的开发服务器时,
我正在尝试使用 Spring 4.2.6 中的 SseEmitter 将消息从后端发送到前端,但是当我发送一些消息或对象时,我收到错误 No适合类 java.lang.String 的转换器,因为我们
我有一个 Spring Controller 方法调用 SseEmitter 将服务器发送的事件推送到浏览器。在浏览器中,为 SSE url 创建 EventSource 的 javascript 是
我正在为下面的休息编写 swagger yaml,但无法将返回类型管理为 SseEmitter。 @RequestMapping(value = "/sse") public SseEmitter g
我是一名优秀的程序员,十分优秀!