我正在尝试模拟一些动态生成的资源。为了生成这些资源,我们必须传入一个类参数。例如:
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);
看起来 mock 被注入(inject)到调用类中,但是 FirstResourceClass
被发送 mockSecondResource
,这会引发编译错误。
问题是(我认为)使用 any() (我从 this question 得到的)。我相信我必须使用 isA()
,但我不确定如何调用该方法,因为它需要一个 Class
参数。我试过 FirstResourceClass.class
,但会出现编译错误。
最佳答案
你想要eq
,如:
PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class)))
.thenReturn(mockFirstResource);
any()
忽略参数,isA
将检查您的参数是否属于某个类——但不会检查它是否等于类,只是它是某个类的instanceof
。 (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
也可以工作(尽管笨拙,因为它们是“继承的”静态 方法)。
关于java - Mockito 匹配特定的类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44014892/