【发布时间】:2020-02-13 09:00:28
【问题描述】:
控制器
@PostMapping("/event/confirmation")
public Mono<CallbackResponse> eventConfirmation(@RequestParam("eventId") String eventId,
@RequestBody ExecutionSummary execSummary, @RequestHeader("customerCode") String customerCode)
throws ResourceNotFoundException {
return eventService
.updateEvent(eventId, execSummary, serviceAuthClient.getDefaultJwtTokenObserver().getJwtAccessToken())
.flatMap(event -> {
return Mono.just(new CallbackResponse(true));
});
}
测试类
@RunWith(SpringRunner.class)
@WebAppConfiguration
@AutoConfigureMockMvc
@SpringBootTest(properties = "spring.main.banner-mode=off")
public class EventStreamControllerTest {
@Mock
private ServiceAuthClient serviceAuthClient;
@Mock
private EventService eventService;
@InjectMocks
private EventStreamController eventStreamController;
@Before
public void setUp() {
Mockito.reset(eventService);
mvc = MockMvcBuilders.standaloneSetup(eventStreamController)
.setControllerAdvice(new ControllerExceptionHandler()).build();
}
@Test
public void testEventConformation() throws Exception {
ExecutionSummary executionSummary = new ExecutionSummary();
executionSummary.setErrorMessage("Test");
Mono<Event> event = Mono.just(new Event());
Mockito.when(eventService.updateEvent(Mockito.anyString(),
Mockito.any(), Mockito.anyString()))
.thenReturn(event);
RequestBuilder requestBuilder =
MockMvcRequestBuilders.post("/event/confirmation")
.contentType(MediaType.APPLICATION_JSON).header("customerCode", "456")
.param("eventId", "123")
.content(objectMapper.writeValueAsString(executionSummary));
MvcResult result = mvc.perform(requestBuilder).andReturn();
assertEquals(HttpStatus.OK.value(),result.getResponse().getStatus());
}
}
当我运行测试时,它实际上调用的是原始服务,它没有使用模拟服务。 有人可以帮我如何为上述控制器方法编写测试。
当我打印模拟服务调用时,它会在输出下方打印。
[Mockito] Unused stubbings of: eventService
1. eventService.updateEvent("", null, "");
- stubbed -> at com.endpoint.rest.controller.EventStreamControllerTest.testEventConformation(EventStreamControllerTest.java:158)
【问题讨论】:
-
如果您的测试控制器确实调用了该方法以及使用哪些参数,您是否在它中设置了断点?在哪个对象上,是您在测试中准备的
eventService模拟吗?最好围绕这个方法展示整个相关的测试类代码,包括声明和设置。 -
你应该更多地了解测试部分:你如何声明/初始化模拟以及如何配置测试运行器
-
@daniu 我在帖子中添加了整个测试类
-
看起来
serviceAuthClient没有被嘲笑,这就引出了serviceAuthClient.getDefaultJwtTokenObserver().getJwtAccessToken()返回什么的问题。是null吗? -
尝试使用
@MockBean而不是@Mock模拟它们。您还需要模拟serviceAuthClient.getDefaultJwtTokenObserver()调用。你也应该尝试断点的事情。
标签: java mockito spring-boot-test reactive-streams