模拟单元测试的请求实体调用



我想模拟请求实体和响应以在控制器方法上测试方法,此代码是由另一个开发人员编写的,我应该使用 mockito 对其进行测试。

我正在尝试模拟请求实体值和响应实体值,但它不起作用,并且在尝试调试时出现反射错误

    public class InquiryController {
private static final Logger log = 
    LoggerFactory.getLogger(InquiryController.class);
@Autowired
private InquiryProperties inquiryProperties;
@Autowired
private InquiryService inquiryService;

@Autowired
RestTemplate restTemplate;
public static int count = 0;

@Bean
private RestTemplate getRestTemplate() {
    return new RestTemplate();
}
    @PostMapping(value = "/endCustomer", produces = { MediaType.APPLICATION_JSON_VALUE }, consumes = {
        MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<List<EndCustomerDTO>> endCustomer(@RequestBody CustomerInfo customerInfo)
        throws IOException, JSONException {
    log.info("### InquiryController.endCustomer() ===>");
    List<EndCustomerDTO> endCustomerDTOs = null;
    try {
        //RestTemplate restTemplate = new RestTemplate();
        RequestEntity<CustomerInfo> body = RequestEntity.post(new URI(inquiryProperties.getEndCustomer()))
                .accept(MediaType.APPLICATION_JSON).body(customerInfo);
        ResponseEntity<List<EndCustomerDTO>> response = restTemplate.exchange(body,
                new ParameterizedTypeReference<List<EndCustomerDTO>>() {
                });
        endCustomerDTOs = (response != null ? response.getBody() : new ArrayList<EndCustomerDTO>());
    } catch (RestClientException | URISyntaxException e) {
        log.error("InquiryController.endCustomer()" + e.getMessage());
    }
    log.info("### END InquiryController.endCustomer()  ===>");
    if (null == endCustomerDTOs) {
        return new ResponseEntity<List<EndCustomerDTO>>(new ArrayList<EndCustomerDTO>(), HttpStatus.OK);
    }
    return new ResponseEntity<List<EndCustomerDTO>>(endCustomerDTOs, HttpStatus.OK);
}
这是因为

当您执行 REST 调用时,RestTemplate 的实例不是通过Spring IOC注入的。您需要在组件类中声明 的getRestTemplate方法,该方法在应用程序启动期间或换句话说,在组件扫描期间扫描。从而使restTemplate可供autowire使用。

按照@chrylis建议将配置与控制器分离后,您可以像这样继续操作。

您一定是在尝试模拟 RequestEntity.post 方法。请注意,它是一个静态方法,与通常的公共实例方法略有不同。为此,您需要使用PowerMockito,因为Mockito不会这样做。

在 POM 中添加依赖项,如下所示:

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.5</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.6.5</version>
    <scope>test</scope>
</dependency>

然后用 @RunWith 注释测试类,@PrepareForTest如下所示:

@RunWith(PowerMockRunner.class)
@PrepareForTest({RequestEntity.class})
public class TestClass {
}

并模拟 POST 方法如下:

PowerMockito.mockStatic(RequestEntity.class);  when(RequestEntity.post(any(URI.class))).thenReturn(getRequestEntityResponseBody());
private RequestEntity< CustomerInfo > getRequestEntityResponseBody(){
 //code
}

更新

CustomerInfo customerInfo = new CustomerInfo();
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("MyResponseHeader", "MyValue");
RequestEntity<CustomerInfo> customerInfoRequestEntity = new ResponseEntity<CustomerInfo>(customerInfo, responseHeaders, HttpStatus.OK);
PowerMockito.mockStatic(RequestEntity.class);
when(RequestEntity.post(any(URI.class))).thenReturn(customerInfoRequestEntity);

相关内容

  • 没有找到相关文章

最新更新