![](/img/trans.png)
[英]Mockito thenReturn always null , Spring-Boot + Junit5 + Mockito
[英]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.