首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用mockito在junit中编写单元测试时,测试类中不必要的存根

使用mockito在junit中编写单元测试时,测试类中不必要的存根
EN

Stack Overflow用户
提问于 2019-07-07 18:17:43
回答 1查看 23.7K关注 0票数 1

方法已作为项目中模块的一部分存在。我正在试着写一个测试用例来提高覆盖率。该方法及其关联的类为:

代码语言:javascript
运行
复制
@Component
public class GenericRestTemplate {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    CtmLogger ctmLogger;

    public <R, T> R persistGenericModelsAsync(T requestModel, Class<R> responseModel, String url, String postCookies)
            throws JsonProcessingException {
        ctmLogger.debugObject(ValueConstant.SHOPPING_CART_SERVICE_NAME,"REST call", url);
        HttpMethod method = HttpMethod.POST;
        Class<R> responseType = responseModel;
        ResponseEntity<JsonNode> response = null;
        HttpHeaders headers = getHeaders(postCookies);
        HttpEntity<T> requestEntity = new HttpEntity<>(requestModel, headers);
        response = restTemplate.exchange(url, method, requestEntity, JsonNode.class);
        ctmLogger.debugObject(ValueConstant.SHOPPING_CART_SERVICE_NAME,"response", response);
        List<String> cookies = response.getHeaders().get(ValueConstant.SET_COOKIE);
        ctmLogger.info("test:", cookies.toString());
        JsonNode responseBody = response.getBody();
        for (String cookie : cookies) {
            System.out.println(cookie);
            if (cookie.startsWith(((ValueConstant.TX_CART_ID)))) {
                ((ObjectNode) responseBody).put(ValueConstant.COOKIES, cookie);
            }
        }

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        if ( response.getBody() != null) {
            System.out.println("entered here");
            return objectMapper.treeToValue(response.getBody(), responseType);
        }
        return (R) response.getBody();
    }

    private HttpHeaders getHeaders(String cartIdCookies) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        headers.add(HttpHeaders.COOKIE, cartIdCookies);
        headers.add(HttpHeaders.HOST, "www-sit-g1.dell.com");
        return headers;
    }

现在我正在尝试为persistGenericModelsAsync()编写一个测试用例。代码如下:

代码语言:javascript
运行
复制
@RunWith(MockitoJUnitRunner.class)
public class GenericRestTemplateTest {

    @InjectMocks
    GenericRestTemplate genericRestTemplate;

    @Mock
    RestTemplate restTemplate;

    @Mock
    CartRequest request;

    @Mock
    HttpEntity<CartRequest> requestEntity;

    @Mock
    ResponseEntity<JsonNode> response;

    @Mock
    HttpHeaders headers;

    @Mock
    List<String> cookies;

    @Mock
    JsonNode responseBody;

    @Mock
    ObjectMapper objectMapper;

    @Mock
    CartResponse cartResponse;

    @Mock
    CtmLogger ctmLogger;

    @Mock
    JsonNode jsonNode; 

    @Mock
    ObjectNode objectNode;

    @Before
    public void setup() {
        cookies = Arrays.asList("TxCartIdtest", "test");

    }

    @Test
    public void persistGenericModelsAsync() throws JsonProcessingException {

        when(restTemplate.exchange(Mockito.anyString(), Mockito.eq(HttpMethod.POST), Mockito.any(HttpEntity.class), Mockito.eq(JsonNode.class))).thenReturn(response);
        when(response.getHeaders()).thenReturn(headers);
        List<String> cookiesTest = Arrays.asList("TxCartIdtest", "test");
        when(headers.get(ValueConstant.SET_COOKIE)).thenReturn(cookiesTest);
        when(response.getBody()).thenReturn(jsonNode);
    }

错误的堆栈跟踪是:

代码语言:javascript
运行
复制
org.mockito.exceptions.misusing.UnnecessaryStubbingException:

Unnecessary stubbings detected in test class: GenericRestTemplateTest
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at com.dell.ctm.cart.util.GenericRestTemplateTest.persistGenericModelsAsync(GenericRestTemplateTest.java:81)
  2. -> at com.dell.ctm.cart.util.GenericRestTemplateTest.persistGenericModelsAsync(GenericRestTemplateTest.java:82)
  3. -> at com.dell.ctm.cart.util.GenericRestTemplateTest.persistGenericModelsAsync(GenericRestTemplateTest.java:84)
  4. -> at com.dell.ctm.cart.util.GenericRestTemplateTest.persistGenericModelsAsync(GenericRestTemplateTest.java:85)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.

我正在尝试模拟一个cookie列表,并尝试查看该方法是否正在执行并覆盖其中的所有语句。但是它抛出了这个不必要的存根异常。我在哪里做了不必要的存根?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-08 16:23:40

代码语言:javascript
运行
复制
@Test
public void persistGenericModelsAsync() throws JsonProcessingException {

    //stubbed - but never used
    when(restTemplate.exchange(Mockito.anyString(), Mockito.eq(HttpMethod.POST), Mockito.any(HttpEntity.class), Mockito.eq(JsonNode.class))).thenReturn(response);

    //stubbed - but never used
    when(response.getHeaders()).thenReturn(headers);
    List<String> cookiesTest = Arrays.asList("TxCartIdtest", "test");
    //stubbed - but never used
    when(headers.get(ValueConstant.SET_COOKIE)).thenReturn(cookiesTest);
    //stubbed - but never used
    when(response.getBody()).thenReturn(jsonNode);
}

很明显,您使用when()创建的存根都不会在任何地方使用。例如。,返回响应对象的第一个存根-在此方法的测试执行中,您从未在任何地方使用过对restTemplate.exchange()的调用。

当您使用strict存根模式时,您需要确保使用您创建的任何存根。请参阅more here

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56921238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档