java - Mockito 匹配特定的类参数

标签 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);

看起来 mock 被注入(inject)到调用类中,但是 FirstResourceClass 被发送 mockSecondResource,这会引发编译错误。

问题是(我认为)使用 any() (我从 this question 得到的)。我相信我必须使用 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 也可以工作(尽管笨拙,因为它们是“继承的”静态 方法)。

关于java - Mockito 匹配特定的类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44014892/

相关文章:

Java 8 - 将 Kairosdb 中的多个对象列表保存到 csv 文件中

java - 为什么hashmap split方法需要在loHead.treeify(tab)之前判断if(hiHead!=Null)

typescript - 用 Jest 模拟 typescript 界面

java - Powermock 和 Jmockit 是否有替代方法来模拟静态和私有(private)方法?

java - 使用 PowerMockito 在最终类中模拟私有(private)静态方法

java - 已部署的 Web 应用程序中的动态 URL 更新

java - Java中的flatMap时是否可以使用组合器函数?

ruby - 让 VCR 跳过 URI :

java - 如何在 TestNG 中使用 Mockito 模拟 jdbc 连接和 resultSet

android - 使用 Dagger 2(Robolectric 和 Mockito)进行单元测试