【问题标题】:Using @InjectMock giving URI not absolute error使用 @InjectMock 给 URI 不是绝对错误
【发布时间】:2022-01-19 07:49:46
【问题描述】:

我已经为使用 rest 模板调用另一个服务但模拟抛出 URI 不是绝对错误的方法编写了以下 Junit。

方法:

@Value("${app.prop.esso-url}")
private String essoUrl;

public  ResponseEntity<String> essoCall(String token) {

    ResponseEntity<String> response=null;
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);
    headers.setBearerAuth(token);

    HttpEntity<String> entity = new HttpEntity<>(headers);
    response= restTemplate.exchange(essoUrl, HttpMethod.GET, entity,String.class);

    logger.info("successfully received response.");
    return response;
}

Junit:

@Autowired
private ObjectMapper objectMapper;

@InjectMocks
SecurityMsServiceImpl securityservice=new SecurityMsServiceImpl();



@Value("${app.prop.esso-url}")
private String essoUrl;

@Mock
private RestTemplate restTemplate;


@Test
    void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() {
    ResponseEntity<String> responseEntity = new ResponseEntity<String>("success", HttpStatus.OK);
    Mockito
        .when(restTemplate.getForEntity(essoUrl
        , String.class))
        .thenReturn(responseEntity);

    ResponseEntity<String> finalresponse=securityservice.essoCall("abc");
    assertEquals(responseEntity, finalresponse);
}

【问题讨论】:

    标签: spring-boot junit mocking mockito resttemplate


    【解决方案1】:

    我一次又一次地看到这个问题:

    您正在测试的方法中构建RestTemplate 的新实例。 你应该做的是将它注入到你的 bean 中,这意味着:

    • 在您的 bean 中添加一个 RestTemplate 类型的字段
    • 在构造函数中初始化
    • 在测试中,传入模拟实例
    • 在 prod 中,通过 Spring DI 传入常规实例

    RestTemplate 是线程安全的,它的一个实例是完全有效的。 见Is RestTemplate thread safe?

    最重要的是:

    • 我的建议是使用构造函数注入而不是字段注入
    • 您将 Spring 的 @Autowired 与 Mockito 的 @InjectMocks 混合使用。选择是否要使用 MockitoExtension 或 SpringExtension 进行测试,并选择适当的注释集来初始化您的 SUT。

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2021-07-09
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多