首页 > 解决方案 > 如何在 mockito 中传递两种不同类型的参数

问题描述

我正在做非常简单的事情,但面临一些问题。所以写了一个非常简单的方法,它采用一个 JsonObject 并根据密钥提取 JsonArry。它工作正常,但是当我尝试编写单元测试时遇到问题。所以以下是需要测试的方法。

public String getA(JSONObject jsonObject) {
    JSONArray educationsArray = jsonService.getJsonArray(jsonObject, "a");
}

public String getB(JSONObject jsonObject) {
    JSONArray educationsArray = jsonService.getJsonArray(jsonObject, "b");
}

这是我正在尝试编写的单元测试。

String json = fileUtil.readFile("data.json");
String content = (String) new JSONObject(json).get("data");
JSONObject contentJson = new JSONObject(content);
when(jsonLinkExtractorService.getJsonArray(contentJson, "a")).thenReturn(jsonArray);

它读取数据的 json 文件,提取元素的数据类型,该元素再次 json 有效负载,然后最后使用提取的字符串创建新的 JSONObject。完成所有这些后,对新创建的 json 对象进行了简单的模拟并传递了密钥。

不是在实际调用方法时返回null。可能的原因是对象 JsonObject 与 Mockito 不同,这就是为什么无法匹配的原因。当我将这两个参数更改为 any(), any() 然后它可以找到但它没有按键过滤。所以有人可以帮助我吗? Mockito 可以匹配两个新创建的对象,或者我可以像下面的语句一样模拟。

any(), "a"

我试过但它抛出异常。有人可以帮我解决这个问题。

谢谢

标签: javajsonmockito

解决方案


如果ArgumentMatchers将参数用于其中一个,则必须将其用于所有参数。在这种情况下,使用ArgumentMatchers.eq("a")代替"a"

when(jsonLinkExtractorService.getJsonArray(any(), eq("a"))).thenReturn(jsonArray);

推荐阅读