【问题标题】:How to mock array of class using Mockito如何使用 Mockito 模拟类数组
【发布时间】:2018-07-05 18:31:10
【问题描述】:

我想模拟 Order 数组类 Order[].class。下面 mockMapper 读取 Order[].class,需要返回 Order[].class。

服务类

public class OrdersConnectorImpl {
    public Order getOrderById(String Id, OrderType orderType) throws Exception {

        Response response = null;
        response = orderServiceTarget.queryParam("ID", Id).queryParam(ORDER_TYPE, orderType).request().accept(MediaType.APPLICATION_JSON)
                .get();
        final StatusType responseStatus = response.getStatusInfo();
        final String serverResponseStr = response.readEntity(String.class);
        if (responseStatus.equals(Response.Status.OK)) {
            objectMapper = getObjectMapper(); // we have a private method in this class
            Order[]  orders = objectMapper.readValue(serverResponseStr, Order[].class);
            if(orders.length>0) {
                return orders[0];
            }
        }
    }
}

测试类

      public class OrdersConnectorImplTest {

        private ObjectMapper mockMapper;

        private class MockOrdersConnectorImpl extends OrdersConnectorImpl {

            @Override
            protected ObjectMapper getObjectMapper() {
                return mockMapper;
            }
        }


    }
      @Test
public void test_getRenewalOrderForContract() throws Exception {
    Response mockResponse = mock(javax.ws.rs.core.Response.class);
    Order mockOrder = mock(Order.class);
    when(mockResponse.getStatusInfo()).thenReturn(Status.OK);
    when(mockResponse.readEntity(String.class)).thenReturn("{}");
    when(mockBuilder.get()).thenReturn(mockResponse);
    when(mockMapper.readValue("{}", Order[].class)).thenReturn(mockOrder); // this is the problem line
    orderConnector.getOrderById("id", OrderType.NEW);

}
}

请在这里纠正我如何返回预期。

【问题讨论】:

    标签: java mockito testng


    【解决方案1】:

    您已经自动连接了mockMapper,这意味着将注入 ObjectMapper 的实际对象。

    when 部分,您设置了mockMapper 的行为,这不应该是这种情况。

    编辑 1

    在您的情况下,不需要模拟 Order 类,您必须返回可以在测试中创建的数组 Order。 供您参考,使用 Junit 没有办法,您可以模拟在方法内部创建的对象。

    【讨论】:

    • 简单地说,我添加了一个自动连线。现在我已经更新了代码。请让我知道如何模拟。
    • 您能解释一下您到底要测试什么吗?哪种方法和类似的东西?
    • 1) 什么是 orderServiceTarget? 2)getObjectMapper(); - 它是否返回 ObjectMapper 的新对象?如果是这样,你就不能模拟 Object Mapper
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2016-05-08
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多