我正在尝试模拟一些动态生成的资源。为了生成这些资源,我们必须传入一个类参数。所以例如:
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);
似乎模拟正在注入到调用类中,但FirstResourceClass
正在mockSecondResource
发送,这会引发编译错误。
问题是(我认为(使用 any(((我从这个问题中得到的(。我相信我必须使用 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
也可以工作(尽管很笨拙,因为它们是"继承">的静态方法(。