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

我想存根一些代码,以便当其中一个参数与特定值匹配时,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数组的一个特定元素。


叮当猫咪
浏览 127回答 2
2回答

DIEA

您可以创建自己的:matcherpublic class MyVarargMatcher extends ArgumentMatcher<String[]> implements VarargMatcher{&nbsp; &nbsp; private String expectedFirstValue;&nbsp; &nbsp; public MyVarargMatcher(String expectedFirstValue)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.expectedFirstValue = expectedFirstValue;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean matches(Object varargArgument) {&nbsp; &nbsp; &nbsp; &nbsp; if (varargArgument instanceof String[])&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] args = (String[]) varargArgument;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Stream.of(args).anyMatch(expectedFirstValue::equals);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }}然后像这样使用它(Java代码):Foo foo = Mockito.mock(Foo.class);Mockito.doReturn(true).when(foo).bar(Mockito.argThat(new MyVarargMatcher("AAA")));编辑了op的评论:只要“AAA”是参数之一,它应该返回true

慕少森

您必须将方法存根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 -> {&nbsp; &nbsp; for (Object argument : invocation.getArguments()) {&nbsp; &nbsp; &nbsp; &nbsp; if ("AAA".equals(argument)) return true;&nbsp; &nbsp; }&nbsp; &nbsp; return false;});在 Kotlin 中也是如此whenever(foo.bar(any()).thenAnswer {&nbsp; &nbsp; it.arguments.contains("AAA")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java