Mockito匹配特定的Class参数

时间:2017-05-17 03:12:07

标签: java mocking mockito

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

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,这给出了编译错误。

1 个答案:

答案 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>