为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Mockito 中存根 varargs 以仅匹配一个参数

如何在 Mockito 中存根 varargs 以仅匹配一个参数

叮当猫咪 2022-08-17 10:33:40
我想存根一些代码,以便当其中一个参数与特定值匹配时,vararg方法返回true。例如,给定我无法更改的现有代码:(在这里使用Kotlin,但我认为这适用于任何Java情况。class Foo {    fun bar(vararg strings : String) : Boolean {        // Iterates `strings` and returns true when one satisfies some criteria    }}...我想编写类似于以下内容的存根代码:val foo = Foo()whenever(foo.bar(eq("AAA"))).thenReturn(true)当调用完全为 时,这可以正常工作。foo.bar("AAA")但是,有时被测代码会进行调用,在这些情况下,它会失败。foo.bar("AAA", "BBB")如何修改我的存根代码,以便在调用中传递任意数量的 vararg 时正常工作?编辑标记为可能的副本;在这种情况下,该场景考虑了调用中varargs的完全省略。在这里,我试图匹配varargs数组的一个特定元素。
查看完整描述

2 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

您可以创建自己的:matcher


public class MyVarargMatcher extends ArgumentMatcher<String[]> implements VarargMatcher

{

    private String expectedFirstValue;


    public MyVarargMatcher(String expectedFirstValue)

    {

        this.expectedFirstValue = expectedFirstValue;

    }


    @Override

    public boolean matches(Object varargArgument) {

        if (varargArgument instanceof String[])

        {

            String[] args = (String[]) varargArgument;

            return Stream.of(args).anyMatch(expectedFirstValue::equals);

        }

        return false;

    }

}

然后像这样使用它(Java代码):


Foo foo = Mockito.mock(Foo.class);

Mockito.doReturn(true).when(foo).bar(Mockito.argThat(new MyVarargMatcher("AAA")));

编辑了op的评论:只要“AAA”是参数之一,它应该返回true


查看完整回答
反对 回复 2022-08-17
?
慕少森

TA贡献2019条经验 获得超9个赞

您必须将方法存根2次。首先是最不具体的存根:


val foo = Foo()

whenever(foo.bar(any())).thenReturn(false) // or whatever you want to return/throw here

然后是更具体的单参数方法:


whenever(foo.bar(eq("AAA"))).thenReturn(true)

在你的评论之后,你也可以使用这样的东西(这次使用Java):


when(foo.bar(any())).thenAnswer(invocation -> {

    for (Object argument : invocation.getArguments()) {

        if ("AAA".equals(argument)) return true;

    }

    return false;

});

在 Kotlin 中也是如此


whenever(foo.bar(any()).thenAnswer {

    it.arguments.contains("AAA")

}


查看完整回答
反对 回复 2022-08-17
  • 2 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信