【问题标题】:Junit test method calling actual service methodJunit测试方法调用实际服务方法
【发布时间】: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


【解决方案1】:

在您的测试类中,您应该将eventService 定义为MockBean。然后它将是一个模拟服务。

@MockBean
private EventService eventService;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多