繁体   English   中英

Spring 引导 / Mockito:Mocking RestTemplate 但始终响应 Null

[英]Spring Boot / Mockito: Mocking RestTemplate but Response Always Null

我在使用 Mockito 时遇到问题 mocking 我的测试 Class 的响应 object。我正在尝试测试异常,为此我需要从 POST 请求返回的 Class 的属性之一。 我已经成功地模拟了 RestTemplate,但是我的 when().thenReturn() 没有返回任何东西,我在“if”验证时得到了一个 null 指针异常。 如果有人可以帮助我解决这个问题,我将不胜感激。

这是我的服务 Class:

@Service
public class CaptchaValidatorServiceImpl implements CaptchaValidatorService{
   private static final String GOOGLE_CAPTCHA_ENDPOINT = "someEndpoint";
   private String stage;
   private String captchaSecret;
   private RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());

   @Override
   public void checkToken(String token) throws Exception{
      MultiValueMap<String,String>  requestMap = new LinkedValueMap<>();
      requestMap.add("secret", captchaSecret);
      requestMap.add("response", token);
      try{
         CaptchaResponse response = restTemplate.postForObject(GOOGLE_CAPTCHA_ENDPOINT,
               requestMap, CaptchaResponse.class);
         if(!response.getSuccess()){
            throw new InvalidCaptchaTokenException("Invalid Token");
         }
      } catch (ResourceAccessException e){
         throw new CaptchaValidationNotPossible("No Response from Server");
      }
   }
   private SimpleClientHttpRequestFactory getClientHttpRequestFactory(){
      ...
   }
}

这是我的测试 Class:

@SpringBootTest
public class CaptchaValidatorTest{
   @Mock
   private RestTemplate restTemplate;
   @InjectMocks
   @Spy
   private CaptchaValidatorServiceImpl captchaValidatorService;
   private CaptchaResponse captchaResponse = mock(CaptchaResponse.class);

   @Test
   public void shouldThrowInvalidTokenException() {
      captchaResponse.setSuccess(false);
      Mockito.when(restTemplate.postForObject(Mockito.anyString(), 
           ArgumentMatchers.any(Class.class), ArgumentMatchers.any(Class.class)))
           .thenReturn(captchaResponse);
      Exception exception = assertThrows(InvalidCaptchaTokenException.class, () -> 
                captchaValidatorService.checkToken("test"));
      assertEquals("Invalid Token", exception.getMessage());
   }
} 

在我看来,这可能是 ArgumentMatchers 的问题。 方法 postForObject 需要参数为 String、MultiValueMap(或父级)和 Class,但您在 Mockito.when 中设置:anyString()(正确)、any(Class.class)(但传递了 MultiValueMap - 可能不正确)和 any(Class.类)(正确)。

尝试使用:

Mockito.when(restTemplate.postForObject(ArgumentMatchers.any(String.class), 
           ArgumentMatchers.any(MultiValueMap.class), ArgumentMatchers.any(Class.class)))
           .thenReturn(captchaResponse);

编辑:在我看来,测试中的 CaptchaResponse 是一个不必要的模拟:

private CaptchaResponse captchaResponse = mock(CaptchaResponse.class);

但如果你想要这样,我认为你需要更换:

captchaResponse.setSuccess(false);

类似于:

Mockito.when(captchaResponse.getSuccess()).thenReturn(false);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM