Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito匹配特定的类参数_Java_Mocking_Mockito - Fatal编程技术网

Java Mockito匹配特定的类参数

Java Mockito匹配特定的类参数,java,mocking,mockito,Java,Mocking,Mockito,我试图模拟一些动态生成的资源。为了生成这些资源,我们必须传入一个类参数。例如: FirstResourceClass firstResource = ResourceFactory.create(FirstResourceClass.class); SecondResourceClass secondResource = ResourceFactory.create(SecondResource.class); 这很好,直到我试图嘲笑。我正在做这样的事情: PowerMockito.mock

我试图模拟一些动态生成的资源。为了生成这些资源,我们必须传入一个类参数。例如:

FirstResourceClass firstResource = ResourceFactory.create(FirstResourceClass.class);

SecondResourceClass secondResource = ResourceFactory.create(SecondResource.class);
这很好,直到我试图嘲笑。我正在做这样的事情:

PowerMockito.mockStatic(ResourceFactory.class);
FirstResourceClass mockFirstResource = Mockito.mock(FirstResourceClass.class);
SecondResourceClass mockSecondResource = Mockito.mock(SecondResourceClass.class);

PowerMockito.when(ResourceFactory.create(Matchers.<Class<FirstResourceClass>>any()).thenReturn(mockFirstResource);
PowerMockito.when(ResourceFactory.create(Matchers.<Class<SecondResourceClass>>any()).thenReturn(mockSecondResource);
PowerMockito.mockStatic(ResourceFactory.class);
FirstResourceClass mockFirstResource=Mockito.mock(FirstResourceClass.class);
SecondResourceClass mockSecondResource=Mockito.mock(SecondResourceClass.class);
when(ResourceFactory.create(Matchers.any()).thenReturn(mockFirstResource);
when(ResourceFactory.create(Matchers.any()).thenReturn(mockSecondResource);
似乎模拟被注入到调用类中,但是
FirstResourceClass
正在发送
mockSecondResource
,这会引发编译错误


问题是(我想)使用any()(我从中得到的)。我相信我必须使用
isA()
,但我不确定如何进行该方法调用,因为它需要
Class
参数。我尝试了
FirstResourceClass.Class
,这会导致编译错误。

您想要
eq
,如:

PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class)))
    .thenReturn(mockFirstResource);
any()
忽略该参数,
isA
将检查您的参数是否属于某个类,而不是它是否等于某个类,只是检查它是否是某个类的
实例。(
any(class)
在Mockito 1.x中具有
any()
语义,在2.x中具有
isA
语义。)

isA(Class.Class)
没有区分调用所需的那么具体,因此
eq
就是这样。无论如何,类对象具有定义良好的相等性,因此这对于您的用例来说是简单而自然的

因为如果不使用匹配器,
eq
是默认值,所以这也适用于:

PowerMockito.when(ResourceFactory.create(FirstResourceClass.class))
    .thenReturn(mockFirstResource);

请注意,Mockito的较新版本不推荐使用Matchers名称,而支持ArgumentMatchers,并且
Mockito.eq
也可以工作(尽管很笨拙,因为它们是“继承的”静态方法)。

any()
匹配任何东西,因此无论如何,这都不起作用。我会尝试
eq()
这里:
Matchers.eq(FirstResourceClass.class)
。这样,当参数等于给定的类时,匹配器就会匹配,这可能是您想要的。谢谢!Matchers.eq()这就是我要找的。请注意,
Matchers
已被弃用,并被最后一段中的
ArgumentMatchers
@AbhijitSarkar所取代。@AbhijitSarkar请不要预先编辑,尤其是错误的:您编写了“编辑”作为版本1中包含的文本的标题前缀。我很感激您错过了它,但这并不意味着文本不正确或需要编辑。@JeffBowman所以答案是社区财产,就像Wikipedia文章一样。我们很感激您的时间,但您不需要在未来几年内监督您的答案。他们可以,而且应该在别人感觉最好的时候进行维护。