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());
}
}
返されたモデルの内部を検査するよりも優れたアプローチが必要であり、私はそれを探しています-何かアイデアはありますか?