java - 没有使用 mockmvc 的请求映射

标签 java spring spring-boot mockito mockmvc

当我使用以下 Controller /测试配置收到“请求的映射错误”时,目前正在努力解决问题。
Controller :

@Slf4j
@Validated
@RestController
@RequiredArgsConstructor
public class AdtechController {

private final AdtechService adtechService;

@PostMapping(value = "/subscriber/session")
public ResponseEntity<ResponseDto> submitSession(@RequestBody RequestDto requestDto) {
    log.trace("execute submitSession with {}", requestDto);
    ResponseDtoresponse = adtechService.submitSession(requestDto);
    return new ResponseEntity<>(response, HttpStatus.OK);
}

@ExceptionHandler(AdtechServiceException.class)
public ResponseEntity<AdtechErrorResponse> handleAdtechServiceException(AdtechServiceException e) {
    return new ResponseEntity<>(new AdtechErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
}

}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@SpringJUnitConfig({AdtechTestConfig.class})
public class AdtechControllerTest {

private static final ObjectMapper OBJECT_MAPPER = JsonUtil.getJackson();

@Autowired
private MockMvc mockMvc;

@Test
public void testSubmitSession() throws Exception {
    RequestDto requestDto = new RequestDto ();
    requestDto.setKyivstarId("1123134");
    requestDto.setMsisdn("123476345242");
    requestDto.setPartnerId("112432523");
    requestDto.setPartnerName("125798756");
    String request = OBJECT_MAPPER.writeValueAsString(requestDto);
    System.out.println("REQUEST: " + request);
    String response = OBJECT_MAPPER.writeValueAsString(new ResponseDto("123"));
    System.out.println("RESPONSE: " + response);
    mockMvc.perform(post("/subscriber/session")
            .content(MediaType.APPLICATION_JSON_VALUE)
            .content(request))
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(content().string(containsString(response)));

}

}
配置:
@Configuration
public class AdtechTestConfig {

@Bean
public AdtechService adtechTestService() {
    return requestDto -> new AdtechResponseDto("123");
}

}
测试执行后,我得到 POST/subscriber/session 没有映射
挣扎的原因是我来自其他具有相同配置的模块的代码工作正常。有人能指出我错过了什么吗?提前致谢!

最佳答案

显然您正在加载一个配置类来模拟 bean,这会干扰 Spring Boot 的其他部分,并可能导致部分加载您的应用程序。我怀疑只有模拟服务可用。
代替测试配置使用 @MockBean为服务创建一个模拟并在其上注册行为。

@SpringBootTest
@AutoConfigureMockMvc
public class AdtechControllerTest {

  private static final ObjectMapper OBJECT_MAPPER = JsonUtil.getJackson();

  @Autowired
  private MockMvc mockMvc;
  @MockBean
  private AdtechService mockService;

  @BeforeEach
  public void setUp() {
    when(mockService.yourMethod(any()).thenReturn(new AdtechResponseDto("123")); 
  }


  @Test
  public void testSubmitSession() throws Exception {
    // Your original test method
  }
}
如果您只想测试您的 Controller ,您可能还需要考虑使用 @WebMvcTest而不是 @SpringBootTest .
@WebMvcTest(AdTechController.class)
public class AdtechControllerTest {

  private static final ObjectMapper OBJECT_MAPPER = JsonUtil.getJackson();

  @Autowired
  private MockMvc mockMvc;
  @MockBean
  private AdtechService mockService;

  @BeforeEach
  public void setUp() {
    when(mockService.yourMethod(any()).thenReturn(new AdtechResponseDto("123")); 
  }


  @Test
  public void testSubmitSession() throws Exception {
    // Your original test method
  }
}
这将加载上下文的缩小版本(仅 Web 部件)并且运行速度会更快。

关于java - 没有使用 mockmvc 的请求映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63251150/

相关文章:

java - 将包含 NULL 的字节数组转换为字符串

java - Android MVVM 与数据绑定(bind)

java - 从 Selenium 的日历中选择日期

java.lang.NoSuchMethodError org.springframework.core.annotation.AnnotationUtils.getAnnotation

spring - 运行Spring Boot Simple App时找不到Oracle驱动程序

java - 创建类路径资源中定义的名为 'entityManagerFactory' 的 bean

c# - 为什么 Java 和 C# 中的逻辑运算符和按位运算符之间存在区别?

java - 在 Spring Data MongoDB 中返回流时指定游标选项?

jquery - 错误解析模板,当我什至没有要求一个时

spring-boot - SpringBoot 弹性缓存 JedisMovedDataException : MOVED