当前位置: 首页 > 知识库问答 >
问题:

简单api调用的Mockito JUnit测试

南门承教
2023-03-14

我认为自己是单元测试的新手,对McCito和JUnit完全陌生。我必须为一些简单的api调用编写单元测试。但我的测试对我来说似乎有点毫无意义,我不知道我哪里出了问题。我向现有的web服务ManagerWS添加了一个方法。java,见下文。

经理。java方法:

public String healthCheck(String userId) { 
    String healthCheckUrlEndpoint  = this.baseUrl()+"/health";
    logger.debug("Calling health check: {}", healthCheckUrlEndpoint);
    HttpHeaders healthCheckHeaders = new HttpHeaders();
    healthCheckHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
    healthCheckHeaders.add(USER_KEY, userId);
    healthCheckHeaders.add(TOKEN_NAME, TOKEN_VALUE);
    healthCheckHeaders.add(Constants.ACCEPT_LANGUAGE_HEADER, LocaleContextHolder.getLocale().toString());
    healthCheckHeaders.add(CORRELATION_HEADER, myService.get(AppLoggingMDCService.LOG_KEY_REQUEST_ID));
    HttpEntity<Object> request = new HttpEntity<Object>(healthCheckHeaders);
    ResponseEntity<String> response;        
    try {
        response = makeRequest(HttpMethod.GET, healthCheckUrlEndpoint, request, String.class); 
    } catch (Exception e) {
        logger.error("Exception encountered during health check", e);
        throw e;
    }       
    logger.debug("RESPONSE : http status: {} - body: {}", response.getStatusCode(), response.getBody());
    return response.getStatusCode().toString();
}

逻辑很简单。构造url,创建标头并将标头添加到请求中。发出请求并从响应中提取状态代码。这是我的测试。注意:类使用@RunAnd(SpringRunner.class),我使用@Mock作为依赖项,使用@InjectMocks作为本地实例ManagerWS。java是正在测试的服务calss。

试验等级试验方法:

    @Test
    public void testHealthCheck() throws Exception {
    //Given
    managerWS = new ManagerWS(templateFactory, configParamService, mdcService, env);    
    String url = "http://baseurl/health";
    HttpHeaders headers = new HttpHeaders();    
    HttpEntity<Object> request = new HttpEntity<Object>(headers);   
    ResponseEntity<String> response = new ResponseEntity<>(HttpStatus.OK);
    //when
    when(managerWS.makeRequest(HttpMethod.GET, url, request, String.class)).thenReturn(response);
    String actualStatus = response.getStatusCode().toString();  
    //then
    Assert.assertEquals("200",actualStatus);
}

对我来说,这个测试似乎很愚蠢(因为缺少一个好词)。我将状态设置为“200”,并断言我设置的是“200”。这没有多大意义。对我来说,它实际上什么都不做。我尝试使用spy(ManagerWS.class)。但我实际上是在不完全理解的情况下抓住救命稻草。

SonarQube仍然抱怨“没有被单元测试覆盖”。我完全不知道如何写这个测试。我还必须为另外三个电话做类似的测试。

我完全是测试新手,我看不出我的错误。请告知。

共有1个答案

鲁鹏
2023-03-14

SonarQube仍然抱怨“单元测试未涵盖”。

您的单元测试不从要测试的方法的入口点进行测试:healthCheck(String),因此单元测试不包括它。此外,您还模拟了要测试的方法部分:

when(managerWS.makeRequest(HttpMethod.GET, url, request, String.class)).thenReturn(response);


事实上,为这段代码编写单元测试看起来也是错误的,或者至少看起来像一个没有什么价值的白盒测试。
为什么?你的逻辑取决于:

response = makeRequest(HttpMethod.GET, healthCheckUrlEndpoint, request, String.class); 

但是,您可以知道它是否只在运行HTTP服务器时工作。因此,您可以做的一件事就是模拟所有内容,监视被测对象,并验证实现中的每个语句是否都已执行:没有可读的测试,没有健壮性和很少/没有值。

基本上依赖于副作用的方法更适合作为集成测试进行测试:

  ManagerWS managerWS; // real ManagerWS implementation without mock

  @Test
  public void healthCheck() throws Exception {
    //Given
    String url = "http://baseurl/health";
    // When
    String actual managerWS.healthCheck(url);
    // Then
    String expected = "...";
    Assertions.assertEquals(expected, actual);
  }

作为旁注,如果您使用Spring,我建议您查看测试切片@WebMvcTest,该切片主要关注被测组件的web部件。它主要允许测试HTTP部分/逻辑(头、请求、响应)。

 类似资料:
  • 我使用Spring Web模块编写RESTAPI,使用WebClient类调用外部API,并使用block()方法等待响应。 我知道我应该使用Spring WebFlux以完全非阻塞的方式编写RESTAPI。但这不是一个选择。 我在编写单元测试和模拟WebClient时遇到问题。我在Stack Overflow中读到了一些WebClient模拟线程,但在我的案例中似乎没有一个能正常工作。 以下是我

  • 我试图通过使用简单的json数据源调用SpringRESTAPI来生成grafana仪表板。实现了启用简单json数据源所需的所有API(/、/search、/query),并按照grafana simple json数据源的预期维护了合同。 此外,还添加了CORS作为响应头的一部分,甚至通过在****@RestController**添加@CrossOrigin来启用请求API的CORS。 当我

  • 我一直试图通过示例来学习xcode和swift,我已经尝试了我搜索的大量示例,但所有这些示例都以这样或那样的方式失败了...通常是错误的swift版本或语法。我想做一个非常简单的应用程序,对我的个人气象站进行api调用,并将json数据打印到我的single view应用程序上的文本框或框架中。我想学习的细节和介绍,我走。我想完善的故事板和视图,因为我学习新的概念。 https://api.wea

  • import { CounterActions, INCREMENT_COUNTER, DECREMENT_COUNTER, } from './counter'; // Mock out the NgRedux class with just enough to test what we want. class MockRedux extends NgRedux<any> { c

  • 虽然这个测试可能是微不足道的,但它说明了单元测试的基本元素。 我们使用解释这个测试是什么,我们使用来断言我们从测试中得到什么样的结果。 这些是用户定义的,因此在这些消息中描述性和准确性是一个好主意。 诸如“应该工作”或“测试服务”之类的消息不能真正解释发生了什么,并且在整个应用程序上运行多个测试时可能会产生混淆。 我们的实际测试是基本的,我们使用制定一个场景,并使用来断言我们从该场景预期的结果条件

  • 本文向大家介绍HTML页面,测试JS对C函数的调用简单实例,包括了HTML页面,测试JS对C函数的调用简单实例的使用技巧和注意事项,需要的朋友参考一下 这里记一下,以后要用的时候可以查! 以上这篇HTML页面,测试JS对C函数的调用简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。