模拟匹配特定的类参数



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

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也可以工作(尽管很笨拙,因为它们是"继承">的静态方法(。

相关内容

  • 没有找到相关文章

最新更新