Aja*_*ayc 3 java mocking mockito
我试图模拟一些动态生成的资源.为了生成这些资源,我们必须传入一个类参数.例如:
FirstResourceClass firstResource = ResourceFactory.create(FirstResourceClass.class);
SecondResourceClass secondResource = ResourceFactory.create(SecondResource.class);
Run Code Online (Sandbox Code Playgroud)
这很好,直到我试图嘲笑.我正在做这样的事情:
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);
Run Code Online (Sandbox Code Playgroud)
似乎模拟被注入到调用类中,但是FirstResourceClass正在发送mockSecondResource,这会引发编译错误.
问题是(我认为)使用any()(我从这个问题得到).我相信我必须使用isA(),但我不知道如何进行该方法调用,因为它需要一个Class参数.我试过了FirstResourceClass.class,这给出了编译错误.
你想要eq,如:
PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class)))
.thenReturn(mockFirstResource);
Run Code Online (Sandbox Code Playgroud)
any()忽略参数,并isA检查你的参数是否属于某个类 - 但不是它等于一个类,只是它是instanceof一个特定的类.(在Mockito 1.x中any(Class)有any()语义,isA在2.x中有语义)
isA(Class.class)没有特定于你需要区分你的电话,所以eq它是.无论如何,类对象具有明确定义的相等性,因此这对于您的用例来说非常简单和自然.
因为eq如果你不使用匹配器是默认值,这也有效:
PowerMockito.when(ResourceFactory.create(FirstResourceClass.class))
.thenReturn(mockFirstResource);
Run Code Online (Sandbox Code Playgroud)
请注意,较新版本的Mockito已弃用Matchers名称而支持ArgumentMatchers,并且Mockito.eq也有效(尽管很笨拙,因为它们是"继承的" 静态方法).
| 归档时间: |
|
| 查看次数: |
4691 次 |
| 最近记录: |