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文章一样。我们很感激您的时间,但您不需要在未来几年内监督您的答案。他们可以,而且应该在别人感觉最好的时候进行维护。