仅当参数满足条件时才模拟方法

时间:2021-01-21 09:11:47

标签: junit mockito powermockito

我正在使用 PowerMockitoMockito 库。在模拟方法时,仅当 JsonObject 类型的方法输入满足某些条件时,我才需要声明返回值。例如,对于键 query 的值等于 queryValue 的所有输入,返回声明的值。 我在下面的代码中结束,我可以检查 then 方法中的输入,这很好,但问题是我认为对于条件不满足的 JsonObjects,它将返回一个空值,因为我必须返回一个值对于 then 方法。

final String queryValue = "some values";
PowerMockito.when(instance.myMethod(Mockito.any(JsonObject.class)))
.then(ans -> {
            JsonObject input = ans.getArgument(0);
            if (queryValue.equals(graphQlQuery.getString("query")))
                return resultValue;
            else
                return null;
        });

所以我想知道有没有办法在调用方法时在输入上指定这样的条件?

谢谢

1 个答案:

答案 0 :(得分:0)

您需要使用与 any 不同的参数匹配器Mockito Documentation 的示例展示了如何匹配不同的参数。

在您的示例中,您不需要复杂的东西:

.when(instance.myMethod(ArgumentMatchers.argThat(
    (JsonObject input) -> queryValue.equals(input.getString("query"))
)))
.thenReturn(resultValue)

<块引用>

问题是我认为对于条件不满足的 JsonObjects,它将返回一个空值,因为我必须为 then 方法返回一个值。

只是为了避免任何误解:如果您使用上面的代码,模拟仍然为没有被任何存根匹配的调用返回一个默认值 (null)。

此代码的不同之处在于您可以添加具有不同匹配器的 other 存根,以处理不同的情况(当参数不是“查询”时)。在您的原始代码中,您必须在同一个地方处理所有调用。