使用对象比较使mockito不那么严格

时间:2017-07-25 22:41:32

标签: java mockito

我有以下代码:

public JSONObject addProductToOrder(int orderId, int productId, String name, double price) {
    JSONObject json = new JSONObject();
    try {
        json.put("orderId", orderId);
        json.put("productId", productId);
        json.put("name", name);
        json.put("price", price);
    } catch (JSONException e) {
        Debugger.out(e);
    }
    return this.dataSource.write("/orderItems/addproductToOrder", json);
}

我想使用Mockito进行测试,我已完成以下操作:

public void getOrder() throws JSONException {
    JSONObject json = new JSONObject("{result: 'OK', error: 0}");
    doReturn(json)
            .when(this.clientSpy) // this.clientSpy = Mockito.spy(client);
            .post("/orderItems/addProductToOrder", new JSONObject("{productId: 1, orderId: 1, price: 15.99, name: 'Product 1'}"));

    OrderItem orderItem = new OrderItem(this.api);
    assertEquals("OK", orderItem.addProductToOrder(1, 1, "Product 1", 15.99).get("result"));
}

我理解事物的方式,我的doReturn()未被触发,因为new JSONObject() !== new JSONObject()

有没有办法让它不比较对象,而只是比较内容?

1 个答案:

答案 0 :(得分:2)

这里发生的是Mockito正在调用 equals()来将您提供给规范的对象与用于实际方法调用的对象进行比较。

基本上,有三种选择:

  • 如果您只提供一个对象,则使用equals()进行比较
  • 然后您有其他各种ArgumentMatchers,例如any()isNull()。请注意:使用此类匹配器时,所有参数必须匹配,您不能这样做:foo(any(), 5)例如。
  • 如果不这样做:您还可以使用ArgumentCaptor。含义:您只需记录传递给模拟的对象,而不是让Mockito比较对象。然后在测试用例中添加另一个步骤,根据需要检查捕获的参数。