我正在尝试模拟动态生成的一些资源。为了生成这些资源,我们必须传入一个类参数。例如:
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()(我从this question获得)。我相信我必须使用isA()
,但我不确定如何进行该方法调用,因为它需要Class
参数。我试过FirstResourceClass.class
,这给出了编译错误。
答案 0 :(得分:5)
您想要eq
,如:
PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class)))
.thenReturn(mockFirstResource);
any()
忽略了这个参数,isA
将检查你的参数是否属于某个类 - 但不是等于一个类,只是它是一个{ {1}}某个班级。 (instanceof
在Mockito 1.x中具有any(Class)
语义,在2.x中具有any()
语义。)
isA
的具体情况不如您区分通话所需的那么具体,所以isA(Class.class)
就是这样。无论如何,类对象具有明确定义的相等性,因此对于您的用例来说这很容易和自然。
如果您不使用匹配器,则eq
是默认设置,因此这也有效:
eq
请注意,较新版本的Mockito已弃用Matchers名称而支持ArgumentMatchers,PowerMockito.when(ResourceFactory.create(FirstResourceClass.class))
.thenReturn(mockFirstResource);
也可以使用(尽管很笨拙,因为它们是“继承”静态方法)。 / p>