【发布时间】:2020-09-15 11:44:35
【问题描述】:
我已经编写了默认接口方法,我想测试它,但我有一个 junit 错误“应用程序上下文失败”。
我的测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SecurityCodeRepository.class})
public class SecurityCodeRepositoryTest {
@Autowired
private SecurityCodeRepository repo;
@Spy
private CustomClientHttpRequestFactory factory;
@Mock
private RestTemplate restTemplate;
@Test
public void testRepoWhenResponse() {
// INIT
final SecurityCodeIn wo = new SecurityCodeIn("123458");
final ResponseEntity<SecurityCodeOut> responseEntity = new ResponseEntity<>(new SecurityCodeOut(true, false), HttpStatus.OK);
when(restTemplate.exchange(anyString(),
any(HttpMethod.class),
any(HttpEntity.class), any(Class.class), anyString())).thenReturn(responseEntity);
// PROCESS
final SecurityCodeOut out = repo.callWS(wo, "urlWs", HttpMethod.POST, new SecurityCheckErrorHandler(), SecurityCodeOut.class,
"ff32223b-bde5-4d60-a21d-4e3e01dcd416");
// CHECKS
assertTrue(out.isRetry());
assertFalse(out.isStatus());
}
}
我要测试的存储库:
@Repository
public class SecurityCodeRepository implements GenericRepository<SecurityCodeIn, SecurityCodeOut> {
/**
* Error LOGGER.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(SecurityCodeRepository.class);
/** The x caller key. */
@Value("${service.x-caller-key}")
private String xCallerKey;
/** The Constant APP_CALLER_KEY. */
private static final String APP_CALLER_KEY = "App-caller-key";
@Autowired
private CustomClientHttpRequestFactory factory;
@Override
public HttpHeaders getHeader() {
final HttpHeaders headersCompleted = new HttpHeaders();
headersCompleted.setContentType(MediaType.APPLICATION_JSON);
headersCompleted.set(APP_CALLER_KEY, xCallerKey);
return headersCompleted;
}
@Override
public Logger getLogger() {
return LOGGER;
}
@Override
public CustomClientHttpRequestFactory getFactory() {
return this.factory;
}
}
我的界面:
public interface GenericRepository<I extends Object, O extends Object> {
HttpHeaders getHeader();
Logger getLogger();
CustomClientHttpRequestFactory getFactory();
default O callWS(final I elementIn, final String url, final HttpMethod method, final ResponseErrorHandler errorHandler, final Class<O> classe,
final Object... paramsUrl) {
final HttpEntity<?> httpEntity = new HttpEntity<>(elementIn, getHeader());
ResponseEntity<O> responseEntity = null;
// Create new restTemplate
final RestTemplate restTemplate = new RestTemplate(getFactory().init(false));
// add logger for debug
restTemplate.setInterceptors(Collections.singletonList(new RequestResponseLoggingInterceptor()));
// add process error
restTemplate.setErrorHandler(errorHandler);
try {
getLogger().info("Appel du webService - {} - {}", url, method);
responseEntity = restTemplate.exchange(url, method, httpEntity,
classe, paramsUrl);
} catch (final RestClientResponseException rce) {
getLogger().error("RestClientException - {}", url, rce);
}
// If there is no response, throw technical exception
if (responseEntity == null) {
throw new WebServiceException("Impossible de contacter l'API ".concat(url));
}
return responseEntity.getBody();
}
}
我的测试调用实现接口并使用默认方法的存储库。所以,这个测试必须模拟 getFactory()。实际上,这个对象在junit测试中是空的。 :/
如何测试我的 GenericRepository 模拟我的 RestTemplate ?
谢谢:)
【问题讨论】:
标签: java spring mockito resttemplate