Mockito 匹配任何类参数
有没有办法匹配以下示例例程的任何类参数?
class A {
public B method(Class<? extends A> a) {}
}
无论将哪个类传递给方法
,如何才能始终返回new B()
?以下尝试仅适用于 A
匹配的特定情况。
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
编辑:一种解决方案是
(Class<?>) any(Class.class)
Is there a way to match any class argument of the below sample routine?
class A {
public B method(Class<? extends A> a) {}
}
How can I always return a new B()
regardless of which class is passed into method
? The following attempt only works for the specific case where A
is matched.
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
EDIT: One solution is
(Class<?>) any(Class.class)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
来自millhouse的解决方案不再适用于最新版本的mockito
该解决方案适用于java 8和mockito 2.2.9
,其中
ArgumentMatcher
是org.mockito.ArgumentMatcher
的实例并且使用
the solution from millhouse is not working anymore with recent version of mockito
This solution work with java 8 and mockito 2.2.9
where
ArgumentMatcher
is an instanceoforg.mockito.ArgumentMatcher
And the use
上面的示例都不适合我,因为我需要为不同的类类型参数多次模拟一个方法。
相反,这是有效的。
这是简短版本:
如您所见,我将自定义ArgumentMatchers与argThat一起使用,不确定是否有更短的方法这也有效。
None of the examples above worked for me, as I'm required to mock one method multiple times for different class type parameters.
Instead, this works.
This is the short version:
As you can see, I'm using custom ArgumentMatchers together with argThat, not sure if there is a shorter way that also works.
还有两种方法可以做到这一点(请参阅我对 @Tomasz Nurkiewicz 之前的答案的评论):
第一个依赖于编译器根本不会让您传递错误类型的内容这一事实:
您丢失了确切的类型(
Class
),但它可能会按照您的需要工作。第二个涉及更多,但如果您确实想要确保
method()
的参数是A
的话,可以说是更好的解决方案> 或A
的子类:其中
ClassOrSubclassMatcher
是org.hamcrest.BaseMatcher
定义为:唷!我会选择第一个选项,直到您确实需要更好地控制
method()
实际返回的内容:-)Two more ways to do it (see my comment on the previous answer by @Tomasz Nurkiewicz):
The first relies on the fact that the compiler simply won't let you pass in something of the wrong type:
You lose the exact typing (the
Class<? extends A>
) but it probably works as you need it to.The second is a lot more involved but is arguably a better solution if you really want to be sure that the argument to
method()
is anA
or a subclass ofA
:Where
ClassOrSubclassMatcher
is anorg.hamcrest.BaseMatcher
defined as:Phew! I'd go with the first option until you really need to get finer control over what
method()
actually returns :-)还有另一种无需强制转换的方法:
此解决方案强制方法
any()
返回Class
类型,而不是其默认值 (Object< /代码>)。
There is another way to do that without cast:
This solution forces the method
any()
to returnClass<A>
type and not its default value (Object
).如果您不知道需要导入哪个包:
或者
If you have no idea which Package you need to import:
OR
怎么样:
或者:
How about:
or: