【问题标题】:Impossible to Mock RestTemplate constructor无法模拟 RestTemplate 构造函数
【发布时间】: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


    【解决方案1】:

    使用@SpringBootTest 注解,Spring Boot 提供了一种方便的方式来启动应用程序上下文以在测试中使用。通过使用classes,我们可以告诉 Spring Boot 使用哪个应用程序类来创建应用程序上下文。 但是您出于某种原因将SecurityCodeRepository.class 指出为classes 参数。您应该将其替换为 Application.class 或完全删除。 Here你可以找到完整的解释

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2013-09-03
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多