我需要将Mockito.when
中的第三方类用作参数。该类没有平等的实现,因此Mockito.when
总是返回null
,除了使用any()
的情况。
以下总是返回null:
when(obj.process(new ThirdParytClass())).thenReturn(someObj);
但是,这有效
when(obj.process(any(ThirdParytClass.class))).thenReturn(someObj);
但是,问题是process()
方法在实际代码中被调用两次,并且使用any()
是模棱两可的,并且无助于覆盖多种情况进行测试。
延长课程无济于事,也会导致其他并发症。
是否有一种解决问题的方法。
如果类未实现(明智的(equals(Object)
,则可以通过实现自己的ArgumentMatcher
来匹配自己的实例。Java 8的功能界面使其很容易编写(并不是说它在早期版本中是如此巨大,但仍然很艰辛(:
when(obj.process(argThat(tpc -> someLogic()))).thenReturn(someObj);
但是,如果您只想比较类的数据成员,那么内置的refEq
匹配器就会做到这一点:
ThirdParytClass expected = new ThirdParytClass();
// set the expected properties of expected
when(obj.process(refEq(expected))).thenReturn(someObj);
Mockito提供了绑架功能,该功能可能有助于您绕过equals()
方法的限制,因为覆盖equals()
进行测试通行证可能是可取的,但并非总是如此。
此外,有时equals()
可能不会太过填充。这是您的用例。
这是带有ArgumentCaptor
的示例代码:
@Mock
MyMockedClass myMock;
@Captor
ArgumentCaptor argCaptor;
@Test
public void yourTest() {
ThirdPartyClass myArgToPass = new ThirdPartyClass();
// call the object under test
...
//
Mockito.verify(myMock).process(argCaptor.capture());
// assert the value of the captor argument is the expected onoe
assertEquals(myArgToPass , argCaptor.getValue());
}