gpt4 book ai didi

java - Mockito 匹配特定的类参数

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:03:41 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com