2017-05-17 36 views
3

我想模拟一些动态生成的资源。为了生成这些资源,我们必须传入一个类参数。例如: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,它抛出一个编译错误。

问题是(我认为)使用任何()(我从this question得到)。我相信我必须使用isA(),但我不确定如何调用此方法,因为它需要参数Class。我试过FirstResourceClass.class,这给编译错误。

+0

'any()'匹配任何东西,无论如何,所以这是行不通的。我会在这里尝试'eq()':'Matchers.eq(FirstResourceClass.class)'。这样,当参数等于给定的类时,匹配器就匹配了,这可能就是你想要的。 –

回答

5

你想eq,如:

PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class))) 
    .thenReturn(mockFirstResource); 

any()忽略的参数,isA将检查你的论点是有一定的阶级,而不是它等于一类,只是它是一个instanceof某个类。 (any(Class)在1.x的的Mockito语义any()和2.x版本isA语义)

isA(Class.class)比你需要区分您的通话不太具体,所以eq它。无论如何,类对象都有明确的平等,所以这对你的用例来说很容易和自然。

因为eq是默认的,如果你不使用的匹配,这也适用:

PowerMockito.when(ResourceFactory.create(FirstResourceClass.class)) 
    .thenReturn(mockFirstResource); 

注意的的Mockito新版本赞成ArgumentMatchers已经过时的匹配器名称,Mockito.eq也可以(虽然笨拙的,因为他们是“继承”静态方法)。

+0

谢谢! Matchers.eq()是我正在寻找的。 – Ajayc