如何使用Spring测试服务器发送的事件?

And*_*ani 6 spring server-sent-events mockmvc

我已经用返回SseEmitter的方法实现了控制器,现在我想对其进行测试。到目前为止,我能找到的唯一方法是:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {SsePaymentReceivedController.class, AutomatBackendContextInitializer.class, EventBusImpl.class})
@WebAppConfiguration
public class SsePaymentReceivedControllerIntegrationTest {

@Inject
WebApplicationContext context;
@Inject
SsePaymentReceivedController sseCoinController;
@Inject
EventBusImpl eventBus;

MockMvc mockMvc;

@Before
public void setUpMockMvc() {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}

@Test
public void subscriptionToSseChannelIsFine() throws Exception {
    MvcResult result = mockMvc.perform(get("/sse/payment"))
            .andExpect(status().isOk())
            .andReturn();
    eventBus.fireNotification(new PaymentReceivedNotification("50", Currency.EURO));
    LinkedHashSet<ResponseBodyEmitter.DataWithMediaType> emitters =
            (LinkedHashSet<ResponseBodyEmitter.DataWithMediaType>)Whitebox.getInternalState(((SseEmitter)result.getModelAndView().getModel().get("sseEmitter")), "earlySendAttempts");
    final Iterator<ResponseBodyEmitter.DataWithMediaType> iterator = emitters.iterator();

    ResponseBodyEmitter.DataWithMediaType dataField = iterator.next();
    assertEquals("data:", dataField.getData());

    ResponseBodyEmitter.DataWithMediaType valueField = iterator.next();
    assertEquals("{\"remainingAmount\":\"50\",\"currency\":\"EURO\"}", valueField.getData());

    ResponseBodyEmitter.DataWithMediaType lastField = iterator.next();
    assertEquals("\n\n", lastField.getData());
}
}
Run Code Online (Sandbox Code Playgroud)

必须有比检查返回模型的内部更好的方法,而我正在寻找-有什么想法吗?

Bax*_*Bax 0

我发现最好的选择是获取响应的内容:

String str1 = result.getResponse().getContentAsString()
// remove data: and \n\n
String str2 = str1.substring(5, str1.length() - 2);
new JsonPathExpectationsHelper("$.remainingAmount").assertValue(str2, "50");
new JsonPathExpectationsHelper("$.currency").assertValue(str2, "EURO");
Run Code Online (Sandbox Code Playgroud)